服务端中获取客户端发送过来的数据一定是关闭套接字之前进行,close之后就收不到数据了。
一般读取数据一般用read,windows上一般用recv(本质上也是read),但是为了跨平台,所以一般用revc。
如下代码
sockaddr_in caddr;
socklen_t len = sizeof(caddr);
int client = accept(sock, (sockaddr*)&caddr, &len);//创建一个新的socket,用来与客户端单独进行通信
printf("accept client %d\n", client);
char* ip = inet_ntoa(caddr.sin_addr);
unsigned short cport = ntohs(caddr.sin_port); //将网络字节序转化为本地字节序
printf("client ip is %s,port is %d\n", ip, cport);
char buffer[1024] = { 0 };
int recvlen = recv(client, buffer, sizeof(buffer)-1,0); //第四个参数这个0是flag和系统相关,有很多自定一的操作,我们这边0就是不对他设置
printf("recv %s\n", buffer);
closesocket(client);
实验演示:
服务端:
客户端:
二:服务端循环接收客户端的数据
将上面的代码进行调整,比如说我们收到用户发一个quit之后我们再退出,不然我们就一直接收用户信息
如下代码:
for (;;)
{
int recvlen = recv(client, buffer, sizeof(buffer) - 1, 0); //第四个参数这个0是flag和系统相关,有很多自定一的操作,我们这边0就是不对他设置
if (recvlen <= 0)
break;
buffer[recvlen] = '\0';
if (strstr(buffer, "quit") != NULL)
break;
printf("recv %s\n", buffer);
}
演示:
服务端
客户端:
版权声明:本文为weixin_43907175原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。