linux 下 socket编程的一个小问题 代码贴出来了 程序编译完全没有问题 就是服务器出不了结果 是recv问题?

//servermei#include<sys/stat.h>#include<fcntl.h>#include<errno.h>#include<netdb.h>#in... //server
mei
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
//创建套接口
int serfd,clifd;
serfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in seraddr,cliaddr;
int addrlen = sizeof(cliaddr);
char buffer[200];
//创建地址
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(6000);
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
// 绑定
bind(serfd,(struct sockaddr *)&seraddr,sizeof(seraddr));

//jianting
listen(serfd,5);
printf("ser is listening\n");
//
clifd = accept(serfd,(struct sockaddr*)&cliaddr,(socklen_t*)&cliaddr);
printf("client send:\n");
while(1)
{
if(recv(clifd,buffer,sizeof(buffer),0) > 0)
printf("client send %s",buffer);
}
return 0;
}

//client

#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
//
int clifd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in seraddr;
char sendbuf[200];

seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(6000);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(clifd,(struct sockaddr *)&seraddr,sizeof(seraddr)) == 0)
printf("linking success!\n");
while(1)
{
printf("send data:\n");
scanf("%s",sendbuf);
if(strcmp(sendbuf,"x")==0)
break;
if(send(clifd,sendbuf,sizeof(sendbuf),0) == -1)
perror("send error!");

}
close(clifd);
return 0;

}
望高手帮我解答哈 在线等
展开
 我来答
heypie
推荐于2016-06-10 · TA获得超过116个赞
知道答主
回答量:65
采纳率:0%
帮助的人:100万
展开全部

问题:

1:accept 最后的参数出错;

2:编程规范严重不足

3:出错异常没有检测,以致问题很难发现

还要注意printf函数说明,这是带缓冲行打印接口,字符串最后最好带回车;

这是我修改过的,请参考,我自己验证通过

//server 

int main()

{

//创建套接口

int serfd,clifd;

serfd = socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in seraddr,cliaddr;

int addrlen = sizeof(cliaddr);

char buffer[200];

//创建地址

bzero(&seraddr,sizeof(seraddr));

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(6000);

seraddr.sin_addr.s_addr = htonl(INADDR_ANY);

// 绑定

if(bind(serfd,(struct sockaddr *)&seraddr,sizeof(seraddr))<0)

{

perror("bind");

        return -1; 

}

//jianting

if(listen(serfd,5)<0)

{

perror("listen");

        return -1; 

}

printf("ser is listening\n");

//

clifd = accept(serfd,(struct sockaddr*)&cliaddr,(socklen_t*)&addrlen);//最后一参数出错

if(clifd < 0)

{

perror("accept");

        return -1; 

}

int recvLen = 0;

while(1)

{

memset(buffer,0,sizeof(buffer));

if((recvLen=recv(clifd,buffer,sizeof(buffer),0)) > 0)

{

printf("client send:%s\n",buffer);

}

else if(recvLen == 0)

{

perror("client closed ");

         return -1; 

}

else

{

perror("recv ");

return -1; 

}

}

return 0;

}

//client

int main(int argc,char *argv[])

{

//

int clifd = socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in seraddr;

char sendbuf[200];

int sendLen;

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(6000);

seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(connect(clifd,(struct sockaddr *)&seraddr,sizeof(seraddr)) == 0)

printf("linking success!\n");

while(1)

{

scanf("%s",sendbuf);

if(strcmp(sendbuf,"x")==0)

break;

if((sendLen=send(clifd,sendbuf,sizeof(sendbuf),0)) <0 )

{

perror("send error!");

return -1; 

}

else if(sendLen == 0)

{

perror("server closed!");

return 0; 

}

printf("send data:%s\n",sendbuf);

}

close(clifd);

return 0;

}

CAIYUE10720795
2011-11-22 · TA获得超过177个赞
知道小有建树答主
回答量:350
采纳率:0%
帮助的人:263万
展开全部
我要向楼主学习,我也在看linux 编程,可是停留在信号量这地方,搞的我头昏脑胀,有机会,我要向楼主请教。。。楼主,留下你qq
追问
qq 379544878 在线聊啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友13f6c3f
2011-11-22 · 超过26用户采纳过TA的回答
知道答主
回答量:76
采纳率:0%
帮助的人:69.6万
展开全部
你把个while循环都去掉就好了 即时聊天不是这么写的
更多追问追答
追问
哪个循环 ?客户端的还是服务器端的?求指点
追答
其实都应该去掉, 不过你可以做个实验,如果只去掉了send的while试试。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式