今天在写简单的TCP通讯例子的时候,遇到了一个问题:server 和client能够连接成功,并且client也能够正常发送,但server就是接收不到,在网上搜索一番后,终于解决了问题。在这里整理如下:

  大家要注意的是,一个server端可以连接多个client端,server端的accept()函数负责等待并接收client的连接请求,而且accept()函数将不同client端的sockfd作为返回值。为了保证接收到对应的client端数据,所以在client连接成功且使用recv()函数接收数据的时候,recv()函数的第一个参数应该是accept成功后的返回值。

实例代码如下:

1.server端

 #include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h> #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 = ,socketFd,sin_size;
socklen_t peerlen;
int recLen = ;
char buf[MAX_MSG_LEN] = {}; if(argc<)
{
printf("please input port number!\r\n");
return -;
} // ipV4 TCP 0
if((socketFd=socket(AF_INET,SOCK_STREAM,))==-)
{
perror("socket");
return -;
}
printf("socket fd = %d\n",socketFd); memset(&servAddr,,sizeof(struct sockaddr_in));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(atoi(arg[]));
servAddr.sin_addr.s_addr= INADDR_ANY; if(bind(socketFd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr))==-)
{
perror("bind:");
}
else
{
printf("bind success \r\n");
} if(listen(socketFd,BACKLOG)==-)
{
perror("listen:");
}
else
{
printf("Listening...\r\n");
}
sin_size=sizeof(struct sockaddr_in); if((socketFd=accept(socketFd,(struct sockaddr *)&clidAddr,&sin_size))==-)
{
perror("accept:");
return -;
}
else
{
printf("accept successful!\r\n");
} while()
{
memset(buf,,sizeof(buf));
if((recLen = recv(socketFd,buf,MAX_MSG_LEN,))==-)
{
perror("recv:");
}
else
{
if(recLen>)
{
recLen = ;
printf("Receive a message:%s\r\n",buf);
}
}
}
close(socketFd);
return ;
}

上述代码的关键在于62行:

if((socketFd=accept(socketFd,(struct sockaddr *)&clidAddr,&sin_size))==-1)
recv(socketFd,buf,MAX_MSG_LEN,0);
将sockfd赋值为accept的返回值问题就解决了,为了实验方便,这里一并附上client代码:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h> #define MAX_MSG_LEN 1024 int main(int argc,char *arg[])
{
struct sockaddr_in servAddr;
struct hostent *host = NULL;
int Port = ,socketFd;
char buf[MAX_MSG_LEN] = {}; if(argc<)
{
printf("please input IP and port number!\r\n");
return -;
} if((host = gethostbyname(arg[]))==NULL)
{
return -;
}
// ipV4 TCP 0
if((socketFd=socket(AF_INET,SOCK_STREAM,))==-)
{
perror("socket");
return -;
}
printf("socket fd = %d\n",socketFd);
memset(&servAddr,,sizeof(struct sockaddr_in));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(atoi(arg[]));
servAddr.sin_addr = (*(struct in_addr *)host->h_addr); if(connect(socketFd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr))==-)
{
perror("connect:");
return -;
} while()
{
printf("input:");
scanf("%s",buf);
if(send(socketFd,buf,sizeof(buf),)==-)
{
perror("send:");
}
{
printf("send successful!\r\n");
}
memset(buf,,sizeof(buf));
}
close(socketFd);
return ;
}
 

最新文章

  1. Apache MiNa 实现多人聊天室
  2. Javascript中自动切换焦点
  3. ECSHOP 商品评论条件修改——购买过该商品且只能评价一次(购买多少次能评价多少次)
  4. 推荐5款超实用的.NET性能分析工具 转
  5. HDU4456-Crowd(坐标旋转+二位树状数组+离散化)
  6. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(五)
  7. Protobuf, understand the hood
  8. MySql优化-你的SQL命中索引了吗
  9. MBProgressHUD简单使用
  10. 即时通信系统Openfire分析之五:会话管理
  11. 使用Roslyn编译项目的示例
  12. 转 深入理解net core中的依赖注入、Singleton、Scoped、Transient
  13. 修改 sql 提示符信息:
  14. toast
  15. MacOS下MySQL配置
  16. IE下的Firebug——IE WebDeveloper js debug
  17. docker registry2
  18. HDU5266-pog loves szh III
  19. HTTP摘要认证原理以及HttpClient4.3实现
  20. fsarchiver创建系统镜像(dd命令也可以)

热门文章

  1. 在 Java 应用程序中绑定 Bean 和数据
  2. 尼康D600闪光灯下按钮
  3. 160418、ztree权限菜单
  4. Spark源码分析 -- TaskScheduler
  5. springData 整合 Rrdis
  6. SpringCloud 入门
  7. 4.GIT安装
  8. notepad插件:url变成可以点击的连接
  9. 嵌入式文件系统构建工具 busybox / buildroot / openwrt
  10. 文件传输(xmodem协议)