c语言socket的一个比较怪的菜鸟问题
小弟接触C也没多久 今天调试个程序 发现个诡异的问题 !!
如果加上 printf("\n"); 程序就出问题 虽然编译也能通过,也能运行 但是就是客户端发送消息 服务端收不到
如果去掉 printf("\n"); 就神奇的好了 真是好奇怪 有老鸟有空帮忙看看吗
下面是服务端代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include<unistd.h>
#define SERVER_PORT 8000
#define MAXLINE 4096
int main() {
struct sockaddr_in serveraddr,clientaddr;
int sockfd,addr_len, confd ,len ,i;
char ipstr[128];
char buf[MAXLINE];
//socket create
sockfd = socket(AF_INET,SOCK_STREAM,0);
//初始化地址
bzero((struct sockaddr *)&serveraddr,sizeof(serveraddr)); //清零
serveraddr.sin_family = AF_INET; // iPv4
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); //监听的IP地址 任何IP
serveraddr.sin_port = htons(SERVER_PORT); //监听端口
bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); //绑定socket
//开启监听 并且设置最大连接数
listen(sockfd,128);//开启监听
while(1) {
//阻塞客户端请求
addr_len = sizeof(clientaddr);
confd = accept(sockfd,(struct sockaddr *)&clientaddr,&addr_len);
printf("client ip = %s:%d\n",
inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,ipstr,sizeof(ipstr)),
ntohs(clientaddr.sin_port));
//处理客户端请求
len = read(confd,buf,sizeof(buf));
i = 0;
while(i < len) {
buf[i] = toupper(buf[i]);
i++;
}
write(confd,buf,len);
printf("\n");
write(STDOUT_FILENO,buf,len);
printf("\n");
close(confd);
}
close(sockfd);
return 0;
}
下面是客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include<unistd.h>
#define SERVER_PORT 8000
#define MAXLINE 4096
int main(int argc,char *argv[]) {
struct sockaddr_in serveraddr;
int confd ,len ,i;
char ipstr[] = "192.168.8.80";
char buf[MAXLINE];
if(argc < 2) {
printf("./client not message!\n");
exit(1);
}
confd = socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
inet_pton(AF_INET,ipstr,&serveraddr.sin_addr.s_addr);
serveraddr.sin_port = htons(SERVER_PORT);
//连接到服务器
connect(confd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
// 请求服务器处理数据
write(confd,argv[1],strlen(argv[1]));
len = read(confd,buf,sizeof(buf));
write(STDOUT_FILENO,buf,len);
//关闭socket
close(confd);
return 0;
}
感觉有时候好 有时候不好 真的好诡异
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
write
使用的是无缓冲的读写方式,printf之类的标准IO是缓冲式的,
就是
write
说写入STDOUT_FILENO
的东西是会立即显示到终端上的,特意运行了代码,没有发现楼主的问题 。。