最近发现基础忘得差不多了,特来温故一下socket编程


client端:

1、初始化socket:

SOCKET Client_st = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET表示internet协议,SOCK_STREAM表示TCP协议(UDP协议:SOCK_DGRAM(好久没看,不知道写错了没))


2、创建一个SOCKADDR_IN:

SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服务器端的IP地址(127.0.0.1表示本机)


3、连接服务端:

connet(Client_st, (SOCKET_ADDR *)&addrSrv, sizeof(addrSrv));    //参数我就不挨个说明了,说说我当时不理解的地方:第二个参数强制转换类型,是因为connet函数是以前写的,所以第二个参数不是SOCKADDR_IN类型(SOCKADDR_IN是后来为了方便使用才新创建的),所以要强制转换一下。如果连接失败,返回-1。


4、向服务器发送消息/接收来自服务器的消息:

send(Client_st, sendBuf, strlen(sendBuf) + 1, 0);    //这里的第三个参数一般用strlen(sendBuf) + 1(网络上的传输,所以不用sizeof,要尽量节省啊~)


recv(Client_st, recvBuf, 256, 0)    //这里接收消息的长度就不用斤斤计较了


5、最后一步,关闭socket

closesocket(Client_st);





server端:其实服务端和客户端大致流程相同,只是服务端多了几个步骤

1、初始化socket:

SOCKET server_st = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET表示internet协议,SOCK_STREAM表示TCP协议(UDP协议:SOCK_DGRAM(好久没看,不知道写错了没))


2、创建一个SOCKADDR_IN:

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);


3、将套接字绑定到一个端口号和本地地址上(如果缺失了这一步,会出现一个不必现的问题,试试吧)
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行


4、开始监听

listen(socSrv, 5);    //第二个参数表示同时监听的最大客户端数量


5、创建并初始化接收客户端的socket
SOCKET sockConn ;
SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体

int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof

memset((void *)&addrClient,0,sizeof(addrClient));
sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);

(这里我以前迷糊了好久,开始不是已经创建了一个socket了吗?怎么又创建一个socket?这第二个socket才是用于接收客户端的socket)


6、发送/接收数据

send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节


recv(sockConn, recvBuf, 100, 0);


7、关闭socket

closesocket(sockConn);
closesocket(socSrv);


传上windows下的客户端与服务端程序: