解决Linux 下server和client 通过TCP通讯:accept成功接收却报错的问题
今天在写简单的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 ;
}
解决Linux 下server和client 通过TCP通讯:accept成功接收却报错的问题的更多相关文章
- Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,
Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错, 这里总结一些可能的原因和解决方案,给需要的朋友: 说道undefined reference err ...
- LINUX下基于NVIDIA HPC SDK 的 VASP6.3.x编译安装报错整理
关于gcc 用旧版本安装NVIDIA HPC SDK再编译会报错: "/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/move.h" ...
- 解决linux下javac -version和java -version版本显示不一致
解决linux下javac -version和java -version版本显示不一致 [javascript] view plaincopy [root@localhost usr]# $JAVA_ ...
- 完美解决 Linux 下 Sublime Text 中文输入
首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sub ...
- Linux 解决Linux下火狐浏览器中文乱码成方块显示问题
解决Linux下火狐浏览器中文乱码成方块显示问题 by:授客 QQ:1033553122 测试环境: CentOS-6.0-x86_64 问题描述: 浏览器页面显示如下 解决方法: 安装中文支 ...
- [转载]解决linux 下多线程错误 undefined reference to `sem_init'
转自:https://blog.csdn.net/yzycqu/article/details/7396498?utm_source=copy 解决linux 下多线程错误 undefined ref ...
- 解决Linux下jdk版本与安装版本不一致
解决Linux下jdk版本与安装版本不一致 在Linux下安装jdk后,利用java -version查看版本使,发现不是自己所安装的jdk版本; 解决方案: which java ——查看默认的jd ...
- 解决linux下tomcat停止进程任存在问题
解决linux下tomcat停止进程任存在问题 在Linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访 ...
- 解决Linux下启动Tomcat遇到Neither the JAVA_HOME ...报错
解决Linux下启动Tomcat遇到Neither the JAVA_HOME ...报错 Neither the JAVA_HOME nor the JRE_HOME environment var ...
随机推荐
- SQL 语句快速参考
来自 W3CSchool 的 SQL 快速参考 SQL 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE conditionAND|OR ...
- Android实现“退出确认”对话框
@Override public void onBackPressed() { new AlertDialog.Builder(this).setTitle("确认退出吗?") . ...
- AngularJS 解决 SEO 问题
由于 AngularJS 返回的是HTML模板,实际的内容需要执行JS以后才会填充进去,导致百度抓取蜘蛛抓不到,因此产生了 AngularJS 的 SEO 问题.经过几天的研究试验,我们的解决方案是这 ...
- [ Office 365 开发系列 ] 身份认证
前言 本文完全原创,转载请说明出处,希望对大家有用. 通常我们在开发一个应用时,需要考虑用户身份认证及授权,Office 365使用AAD(Azure Active Directory)作为其认证机构 ...
- HAPROXY简介
HAProxy 是一款高性能TCP/HTTP 反向代理负载均衡服务器,具有如下功能: 根据静态分配的cookies完成HTTP请求转发 在多个服务器间实现负载均衡,并且根据HTTP cookies 实 ...
- Java Filter过滤xss注入非法参数的方法
http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...
- [iOS微博项目 - 4.1] - cell的frame模型
github: https://github.com/hellovoidworld/HVWWeibo A.cell的frame模型设计 1.需求 每个cell都有一个frame实例引用 frame模型 ...
- 小程序 Page is not constructed because it is not found.
如下错误一般发生在点击事件切换页面的时候 解决方式: 在需要切换到的那个页面的js文件中添加Page({ })方法即可解决此问题. Tis:在js文件中输入Page回车,可自动添加Page方法,包括里 ...
- python(五)常用模块学习
版权声明:本文为原创文章,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明. https://blog.csdn.net/fgf00/article/details/52357 ...
- golang函数学习笔记
golang函数特点: a.不支持重载,一个包不能有两个名字一样的函数 b.函数是一等公民,函数也是一种类型,一个函数可以赋值给变量 c.匿名函数 d.多返回值 例子1 func add(a, b ...