BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #32727同步于 2009/12/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

帮忙解决下socket send 返回0的问题

frozenstar
2009/12/5镜像同步13 回复
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> struct key { char msg_from[64]; int msg_length; char msg_content[1024]; }; /*用于报错并返回shell*/ static void bail(const char *on_what){ fputs(strerror(errno),stderr); fputs(":",stderr); fputs(on_what,stderr); fputc('\n',stderr); exit(1); } int main(int argc, char **argv){ int z; char*srvr_addr=NULL; char*srvr_port="9099"; struct sockaddr_in adr_srvr; int len_inet; int s; int n; struct key *msg_cln; /*使用命令行提供的服务器地址,否则使用缺省地址*/ if(argc>=2){ srvr_addr=argv[1]; }else{ srvr_addr="127.0.0.1"; } /*若给定端口号则使用*/ if(argc>=3) srvr_port=argv[2]; /*建立服务器接口地址*/ memset(&adr_srvr,0,sizeof adr_srvr); adr_srvr.sin_family=AF_INET; adr_srvr.sin_port=htons(atoi(srvr_port)); adr_srvr.sin_addr.s_addr= inet_addr(srvr_addr); if(adr_srvr.sin_addr.s_addr==INADDR_NONE) bail("bad address."); for(;;){ /*生成TCP/IP套接口*/ s=socket(AF_INET,SOCK_STREAM,0); if(s==-1) bail("socket()"); len_inet=sizeof adr_srvr; /*连接到服务器*/ z=connect(s,(struct sockaddr *)&adr_srvr,len_inet); if(z==-1) bail("connect(2)"); /*memset(dtbuf,0,2048); memcpy(dtbuf,&msg_cln,sizeof(msg_cln));*/ if(n=send(z,msg_cln,sizeof(struct key),MSG_WAITALL )!=sizeof(struct key)){ perror("Can not send msg\n"); exit(1); } printf("the send message is %d\n",n); close(s); sleep (10); } return 0; } 网上查了一下可能的原因,有的说是因为发送的就是0,有的说是在send之前 socket就已经关闭了,第一次编写,求大牛指点
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
DarkIce机器人#1 · 2009/12/5
if(n=send(z,msg_cln,sizeof(struct key),MSG_WAITALL )==sizeof(struct key) 需要加一个括号 if((n=send(z,msg_cln,sizeof(struct key),MSG_WAITALL ))==sizeof(struct key)) 【 在 frozenstar (韦世雄(关中道驻幽州联系人)) 的大作中提到: 】 : #include <stdio.h> : #include <unistd.h> : #include <stdlib.h> : ...................
frozenstar机器人#2 · 2009/12/5
【 在 DarkIce 的大作中提到: 】 : if(n=send(z,msg_cln,sizeof(struct key),MSG_WAITALL )==sizeof(struct key) : 需要加一个括号 : if((n=send(z,msg_cln,sizeof(struct key),MSG_WAITALL ))==sizeof(struct key)) 还是不行阿
bobw机器人#3 · 2009/12/5
connect不是accept呀,不会返回新的socket的 send的socket还是s 【 在 frozenstar 的大作中提到: 】 : #include <stdio.h> : #include <unistd.h> : #include <stdlib.h> : ...................
frozenstar机器人#4 · 2009/12/5
【 在 bobw 的大作中提到: 】 : connect不是accept呀,不会返回新的socket的 : send的socket还是s 恩,这个问题我也刚发现,改了以后就成运行就成这样了: Can not send msg : Success
DarkIce机器人#5 · 2009/12/5
你加那个括号了么?? 这个应该是成功了啊 【 在 frozenstar (韦世雄(关中道驻幽州联系人)) 的大作中提到: 】 : 恩,这个问题我也刚发现,改了以后就成运行就成这样了: : Can not send msg
frozenstar机器人#6 · 2009/12/5
【 在 DarkIce 的大作中提到: 】 : 你加那个括号了么?? : 这个应该是成功了啊 加了,然后就是报上面的那个错。
frozenstar机器人#7 · 2009/12/5
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <sys/wait.h> #include <signal.h> #ifndef SHUT_RDWR #define SHUT_RDWR 3 #endif struct key { char msg_from[64]; int msg_length; char msg_content[1024]; }; /*处理终止的子进程*/ static void sigchld_handler(int signo){ pid_t PID; int status; do{ PID=waitpid(-1,&status,WNOHANG); }while (PID!=-1); /*充值信号处理*/ signal(SIGCHLD,sigchld_handler); } /*用于报错并返回到SHELL*/ static void bail(const char *on_what){ if(errno!=0){ fputs(strerror(errno),stderr); fputs(":",stderr); } fputs(on_what,stderr); fputc('\n',stderr); exit(1); } int main(int argc,char **argv){ int z; char *srvr_addr=NULL; char *srvr_port="9099"; struct sockaddr_in adr_srvr; struct sockaddr_in adr_clnt; int len_inet; int s; int c; int n; struct hostent *hp; pid_t PID; struct key msg_rec; /*捕捉信号SIGGHLD*/ signal(SIGCHLD,sigchld_handler); /*使用命令行提供的服务器地址,否则使用缺省地址*/ if(argc>=2){ srvr_addr=argv[1]; }else{ srvr_addr="127.0.0.1"; } if(argc>=3) srvr_port=argv[2]; /*生成TCP/IP套接口*/ s=socket(AF_INET,SOCK_STREAM,0); if(s==-1) bail("socket()"); /*建立服务器套接口地址*/ memset(&adr_srvr,0,sizeof adr_srvr); adr_srvr.sin_family=AF_INET; adr_srvr.sin_port=htons(atoi(srvr_port)); if(strcmp(srvr_addr,"*")!=0){ /*正常地址*/ adr_srvr.sin_addr.s_addr= inet_addr(srvr_addr); if(adr_srvr.sin_addr.s_addr ==INADDR_NONE) bail("bad address."); }else{ /*通配地址*/ adr_srvr.sin_addr.s_addr= INADDR_ANY; } /*绑定服务器地址*/ z=bind(s,(struct sockaddr*)&adr_srvr, sizeof(adr_srvr)); if(z==-1) bail("bind(2)"); /*监听套接口*/ z=listen(s,10); if(z==-1) bail("listen(2)"); /*开始服务器循环*/ for(;;){ /*等待链接*/ len_inet=sizeof adr_clnt; c=accept(s,(struct sockaddr*)&adr_clnt,&len_inet); if(c==-1) bail("accept(2)"); /*生成一个新服务器进程服务客户请求*/ if((PID=fork())==0){ memset(&msg_rec,0,sizeof(msg_rec)); if((n=recv(c,&msg_rec,sizeof(msg_rec),0))!=sizeof(struct key)){ perror("Can not receive msg\n"); exit(1); } hp=gethostbyaddr( (char*)&adr_clnt.sin_addr, sizeof adr_clnt.sin_addr, adr_clnt.sin_family); printf("The clinet IP address is %s\n",hp->h_name); printf("%d message has received\n",n); close(c); exit(0); } /* 子进程退出*/ close(c); } } 这个是服务器的程序
ericyosho机器人#8 · 2009/12/5
你这个是client的代码,还是server的代码啊? 怎么觉得你都写在一块儿捏?
frozenstar机器人#9 · 2009/12/5
最上面的那个是客户端的,程序的作用是客户端周期的向服务器发送一个结构,改了一下,发送是1092,接受的却是4.