返回信息流#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就已经关闭了,第一次编写,求大牛指点
这是一条镜像帖。来源:北邮人论坛 / cpp / #32727同步于 2009/12/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
帮忙解决下socket send 返回0的问题
frozenstar
2009/12/5镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
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>
: ...................
【 在 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))
还是不行阿
connect不是accept呀,不会返回新的socket的
send的socket还是s
【 在 frozenstar 的大作中提到: 】
: #include <stdio.h>
: #include <unistd.h>
: #include <stdlib.h>
: ...................
【 在 bobw 的大作中提到: 】
: connect不是accept呀,不会返回新的socket的
: send的socket还是s
恩,这个问题我也刚发现,改了以后就成运行就成这样了:
Can not send msg
: Success
你加那个括号了么??
这个应该是成功了啊
【 在 frozenstar (韦世雄(关中道驻幽州联系人)) 的大作中提到: 】
: 恩,这个问题我也刚发现,改了以后就成运行就成这样了:
: Can not send msg
#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);
}
}
这个是服务器的程序