socket通信

<!DOCTYPE html>

socket通信

socket通信

函数说明

基本思路:搭建一个过河的桥,如果用木头来搭建的话,那函数就是一根一根的木头。这些函数早就有了,无需我们从头种树再取材,拿来用就好了。

先加载函数库,创建socket,绑定到本地地址,socket设置为监听模式,等待请求,有请求到来时接受请求,,等等

通信需要客户端和服务端,服务端源码



本机1234端口监听中

用虚拟机telnet本机,失败。。也许是win8安全策略限制吧。
把exe文件拷贝到虚拟机,打算本机telnet虚拟机,失败,运行不兼容。


。。原来是要relese版本

relese版本的使用方法参考




本机尝试telnet,一旦连上,虚拟机listen框就关上了。。虚拟机成功将一个hello发送到本机,姑且算成功了。。吧


2017.12.14更新:

第一步,导入要使用的头文件库文件

#pragma comment(lib, "ws2_32.lib")

#include <winsock2.h>

#include <stdio.h>

第二步,写个主函数

int main() { }

调用函数,初始化。

WSADATA wsa;

WSAStartup(MAKEWORD(2,2),&wsa);

MAKEWORD函数,将两个byte合成一个word类型。呃,我也不太了解具体细节和作用。

if(WSAStartup(sockVersion, &wsaData) != 0)

return 0;

如果返回值为0,代表初始化成功的意思。

第三步,定义socket名称。

socket函数,三个参数,第一个是address family,地址家族;第二个是类型type;第三个是protocol协议。

SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

SOCKET关键字,定义了套接字名称为sListen

AF_INET代表在internet上通信,SOCK_STREAM代表使用TCP协议(而不是udp协议),IPPROTO_TCP参数指出了协议。

第四步,定义ip端口信息。

sockaddr和sockaddr_in 结构体

struct sockaddr_in my_addr; // 本地地址信息,定义了自己的结构体my_addr;于是下面要用my_addr,定义IP端口等信息

struct sockaddr_in their_addr;// 连接者地址信息

my_addr.sin_family = AF_INET; // 协议类型是INET

my_addr.sin_port = htons(1234);          // 绑定端口1234

my_addr.sin_addr.s_addr = INADDR_ANY;  // 本机IP

第五步,将定义好的结构体与socket绑定,使用bind函数

if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

{

printf(" bind error \n");

closesocket(sListen);

return 0;

}

//sListen是第一个参数,是要绑定的socket,(见第三步)

//(sockaddr *)&my_addr 是第二个参数,是要绑定的网络地址结构体(见第四步)

//sizeof(SockAddrIn)是第三个参数,是第二个参数网络地址结构体的大小。

第六步,监听客户端的消息,使用listen函数,该函数就是下面黑体字,参数有两个,socket名称,和允许同时连接最大数量。

if(listen(sListen, 5) == SOCKET_ERROR)

{

printf("listen error\n");

closesocket(sListen);

return 0;

}

第七步,接受客户端请求,使用accept函数。

while(TRUE){

sockClient = accept(sListen, (SOCKADDR *)&their_addr, sizeof(their_addr))

}

//while(true)会一直循环,如果没有该语句,接收到之后,就会往下执行了,不再接受新的连接。

//和第五步有点相似,只不过bind是绑定本地地址,accept是接受客户端地址信息。

//第一个参数是定义的socket;第二个参数是结构体(their_addr,在第四步定义了);第三个参数是第二个参数网络地址结构体的大小。

第八步,发送给客户端消息,代表连接成功了,用send函数。

char *buff="\r\nsucess!\r\n";

send(sClient,buff,strlen(buff),0);

第九步,关闭调用的。。

closesocket(sClient);

closesocket(sListen);

WSACleanup();

return 0;

由于不知道如何用g++链接winsock2.h,总是提示未定义的引用,所以还是用visual  c ++,F7编译运行。