//服务器端代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<malloc.h>
#define MAXBUF 1024
int main()
{
int pid;
int sockfd,new_fd;
socklen_t len;
struct sockaddr_in my_addr, their_addr;
unsigned int myport,listnum;
char buf[MAXBUF+1];
myport=7575;
listnum=5;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socker");
exit(EXIT_FAILURE);
}
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(myport);
my_addr.sin_addr.s_addr=inet_addr("192.168.1.106");
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
perror("bind");
exit(EXIT_FAILURE);
}
if(listen(sockfd,listnum)==-1){
perror("listen");
exit(EXIT_FAILURE);
}
printf("wait for connect\n");
len=sizeof(struct sockaddr);
if(new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&len)==-1){
perror("accept");
exit(EXIT_FAILURE);
}
else
printf("server:got conection!");
if((pid=fork())==-1){
perror("fork");
exit(EXIT_FAILURE);
}
else if(pid==0){
while(1){
memset(buf,0,sizeof(buf));
fgets(buf,MAXBUF,stdin);
if(!strncasecmp(buf,"quit",4)){
printf("i will close the connection");
break;
}
len=send(new_fd,buf,strlen(buf)-1,0);
if(len<0){
printf("message send failed!");
break;
}
}
}
else{
while(1){
bzero(buf,MAXBUF+1);
len=recv(new_fd,buf,MAXBUF,0);
if(len>0)
printf("message recv successful:%s \n",buf);
else if(len<0){
printf("recv failed!");
break;
}
else{
printf("the other one close quit \n");
break;
}
}
}
close(new_fd);
close(sockfd);
return 0;
}
//客户端的代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<resolv.h>
#include<unistd.h>
#include<arpa/inet.h>
#define MAXBUF 1024
int main()
{
int sockfd,len,destport=7575;
struct sockaddr_in dest;
char buf[MAXBUF+1];
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(errno);
}
printf("socket created\n");
memset(&dest,0,sizeof(dest));
dest.sin_family=AF_INET;
dest.sin_port=htons(destport);
dest.sin_addr.s_addr=inet_addr("192.168.1.106");
if((connect(sockfd,(struct sockaddr *)&dest,sizeof(dest)))==-1){
perror("connect");
exit(errno);
}
printf("server connected!\n");
pid_t pid;
if((pid=fork())==-1){
perror("fork");
exit(errno);
}
else if(pid==0){
while(1){
memset(buf,0,sizeof(buf));
len=recv(sockfd,buf,MAXBUF,0);
if(len>0)
printf("recv successful:%s \n",buf);
else if(len<0){
perror("recv");
exit(errno);
}
else{
printf("the other one close ,quit\n");
break;
}
}
}
else{
while(1){
memset(buf,0,sizeof(buf));
printf("pls send message to send:");
fgets(buf,MAXBUF,stdin);
if(!strncasecmp(buf,"quit",4)){
printf("i will quit\n");
break;
}
len=send(sockfd,buf,strlen(buf)-1,0);
if(len<0){
perror("send");
break;
}
}
}
close(sockfd);
return 0;
}
用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 ==
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 开水 2015-04-12 08:54关注
有两个问题:
- 你bind之后没有调用Listen函数
-
socklen_t
是无符号整型,你用socklen_t len
这个变量去存储recv的返回值,然后又判断它是否大于0,结果就是:返回值为-1,但判断结果会认为这是个正数,所以accept、recv看起来都成功了,你的程序就到死循环里去了。其实你accept的时候就失败了,因为之前没调用listen函数。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥100 求数学坐标画圆以及直线的算法
- ¥100 c语言,请帮蒟蒻写一个题的范例作参考
- ¥15 名为“Product”的列已属于此 DataTable
- ¥15 安卓adb backup备份应用数据失败
- ¥15 eclipse运行项目时遇到的问题
- ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
- ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
- ¥15 自己瞎改改,结果现在又运行不了了
- ¥15 链式存储应该如何解决
- ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站