争怎路由网:是一个主要分享无线路由器安装设置经验的网站,汇总WiFi常见问题的解决方法。

处理Linux下server与client通过TCP通讯:accept成功接收却报错

时间:2024/6/11作者:未知来源:争怎路由网人气:

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
今天在写简单的TCP通讯例子的时候,遇到了一个问题:server 和client能够连接成功,并且client也能够正常发送,但server就是接收不到,在网上搜索一番后,终于解决了问题。在这里整理如下:
 
大家要注意的是,一个server端可以连接多个client端,server端的accept()函数负责等待并接收client的连接请求,而且accept()函数将不同client端的sockfd作为返回值。为了保证接收到对应的client端数据,所以在client连接成功且使用recv()函数接收数据的时候,recv()函数的第一个参数应该是accept成功后的返回值。
 
实例代码如下:
1.server端
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_MSG_LEN 1024
#define BACKLOG 10 
int main(int argc,char *arg[])
{
struct sockaddr_in servAddr,clidAddr;
struct hostent *host = NULL;
int Port = 0,socketFd,sin_size;
socklen_t peerlen;
int recLen = 0;
char buf[MAX_MSG_LEN] = {0};
if(argc<>
{
printf("please input port number!\r\n");
return -1;
}
// ipV4 TCP 0
if((socketFd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return -1;
}
printf("socket fd = %d\n",socketFd);
memset(&servAddr,0,sizeof(struct sockaddr_in));
servAddr.sin_family = AF_INET;
servAddr.sin_port   = htons(atoi(arg[1]));
servAddr.sin_addr.s_addr= INADDR_ANY;
if(bind(socketFd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr))==-1)
{
perror("bind:");
}
else
{
printf("bind success \r\n");
}
if(listen(socketFd,BACKLOG)==-1)
{
perror("listen:");
}
else
{
printf("Listening...\r\n");
}
sin_size=sizeof(struct sockaddr_in);
if((socketFd=accept(socketFd,(struct sockaddr *)&clidAddr,&sin_size))==-1)
{
perror("accept:");
return -1;
}
else
{
printf("accept successful!\r\n");
}
while(1)
{
memset(buf,0,sizeof(buf));
if((recLen = recv(socketFd,buf,MAX_MSG_LEN,0))==-1)
{
perror("recv:");
}
else
{
if(recLen>0)
{
recLen = 0;
printf("Receive a message:%s\r\n",buf);
}
}
}
close(socketFd);
return 0;
}
 
上述代码的关键在于62行:
if((socketFd=accept(socketFd,(struct sockaddr *)&clidAddr,&sin_size))==-1)
recv(socketFd,buf,MAX_MSG_LEN,0);
 
将sockfd赋值为accept的返回值问题就解决了,为了实验方便,这里一并附上client代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_MSG_LEN 1024
int main(int argc,char *arg[])
{
struct sockaddr_in servAddr;
struct hostent *host = NULL;
int Port = 0,socketFd;
char buf[MAX_MSG_LEN] = {0};
if(argc<>
{
printf("please input IP and port number!\r\n");
return -1;
}
if((host = gethostbyname(arg[1]))==NULL)
{
return -1;
}    
// ipV4 TCP 0
if((socketFd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return -1;
}    
printf("socket fd = %d\n",socketFd);
memset(&servAddr,0,sizeof(struct sockaddr_in));
servAddr.sin_family = AF_INET;
servAddr.sin_port   = htons(atoi(arg[2]));
servAddr.sin_addr    = (*(struct in_addr *)host->h_addr);
if(connect(socketFd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr))==-1)
{
perror("connect:");
return -1;
}
while(1)
{
printf("input:");
scanf("%s",buf);
if(send(socketFd,buf,sizeof(buf),0)==-1)
{
perror("send:");
}
{
printf("send successful!\r\n");
}
memset(buf,0,sizeof(buf));
}
close(socketFd);
return 0;
}

Linux是一套免费使用和自由传播的类Unix操作系统



关键词:处理Linux下server与client通过TCP通讯:accept成功接收却报错




Copyright © 2012-2018 争怎路由网(http://www.zhengzen.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版