最近发现基础忘得差不多了,特来温故一下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下的客户端与服务端程序: