socket 编程 listen函数 阻塞了 而且accept函数接受连接后 只有读取数据才会向下执行 纠结很久了 有大佬帮忙看一下么 谢谢了

vliaolan 2018-05-10 05:03:47
// 服务器端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
int main(int argc,char *argv[])
{

int sockfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[1]));
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
perror("bind error");
exit(1);
}
printf("bind\n");
if(listen(sockfd,10)<0){
perror("listen error");
exit(1);
}
struct sockaddr_in clientaddr;
char buffer[512];
socklen_t clientaddr_len = sizeof(clientaddr);
printf("listen");
while(1){
int fd = accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len);
printf("accept connect");
if(fd<0){
perror("accept error");
continue;
}
printf("accept connect");
pid_t pid=fork();
if(pid <0){
continue;
}else if(pid == 0){
// child process
while(1){
memset(buffer,0,sizeof(buffer));
read(sockfd,buffer,sizeof(buffer));
fputs(buffer,stdout);
}
}else {
printf("parent process");
}

}
// close(fd);
close(sockfd);
return 0;
}

// 客户端

#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
int main(int argc,char *argv[])
{

int sockfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[1]));
char ip[16];
memset(ip,0,sizeof(ip));
strcpy(ip,"127.0.0.1");
inet_pton(AF_INET,ip,&serveraddr.sin_addr.s_addr,sizeof(serveraddr));
char buffer[512];
if(connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
perror("connect error");
exit(1);
}
printf("connect ok \n");
// close(fd);
while(1){
int ret;
if(( ret= write(sockfd,buffer,sizeof(buffer)))<0){
perror("write error");
continue;
}
read(sockfd,buffer,ret);
fputs(buffer,stdout);
memset(buffer,0,sizeof(buffer));
}
return 0;
}
...全文
1139 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rjw_999 2018-05-16
  • 打赏
  • 举报
回复
print有缓冲区的,执行了也不一定在屏幕上能看见输出
haotoufeishi 2018-05-14
  • 打赏
  • 举报
回复
你要注意accept函数,它的第一个参数sockfd称为监听套接口,它的返回值fd才是已连接套接口,服务器中数据传输应该用fd而不是sockfd
vliaolan 2018-05-14
  • 打赏
  • 举报
回复
确实是这个问题 检查了好多次 后来发现这有问题 还有一个点 在客户端已经连接上后 服务器端的在accept函数堵塞时 bind函数与listen下面的两条print语句并没有输出,只有在我传输数据时才会被打印一次 ,就很奇怪

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧