当前位置: 技术问答>linux和unix
LINUX下C/S编程问题
来源: 互联网 发布时间:2015-11-16
本文导语: 本人因需要,需要写一个linux下的双机通讯程序,用tcp协议传送数据。 服务器上的应用程序如下: #include #include #include #include #include #include #include #define MY_PORT 21...
本人因需要,需要写一个linux下的双机通讯程序,用tcp协议传送数据。
服务器上的应用程序如下:
#include
#include
#include
#include
#include
#include
#include
#define MY_PORT 2100
void main()
{
int sock_serv,new_fd;
unsigned int sin_size;
struct sockaddr_in host_addr,remo_addr;
sock_serv=socket(AF_INET,SOCK_STREAM,0);/*主机建立socket*/
if(sock_serv!=-1)
printf("Socket created OKn");
else
exit(1);
host_addr.sin_family=AF_INET;/*初始化主机socket地址*/
host_addr.sin_addr.s_addr=htonl(INADDR_ANY);
host_addr.sin_port=htons(MY_PORT);
bzero(&(host_addr.sin_zero),8);
if(bind(sock_serv,(struct sockaddr *)&host_addr,sizeof(struct sockaddr))!=-1)
printf("Binded OKn");
else
exit(1);
if(listen(sock_serv,1)!=-1)
printf("listeningn");
else
exit(1);
while(1){
sin_size = sizeof(struct sockaddr);
new_fd = accept(sock_serv, (struct sockaddr *)&remo_addr, &sin_size);
if(new_fd!=-1){
printf("Acepted OKn");
printf("server: got connection from %sn", inet_ntoa(remo_addr.sin_addr));}
else
exit(1);
}
}
客户端上的程序如下:
#include
#include
#include
#include
#include
#include
#include
void main()
{
int sock_cli;
struct sockaddr_in serv_addr;
sock_cli=socket(AF_INET,SOCK_STREAM,0);
if(sock_cli!=-1)
printf("Socket created OKn");
else exit(1);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=2100;
serv_addr.sin_addr.s_addr=htonl(inet_addr("127.0.0.1"));
bzero(&(serv_addr.sin_zero),8);
if(connect(sock_cli,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))!=-1){
printf("Connected OKn");
}
else exit(1);
}
为调试程序,在linux上开两个终端,分别运行服务器程序和客户端程序,以实现本机发送,本机接收。但服务器没有客户端连接,客户端也连不上服务器。郁闷啊!希望大虾指点迷津,谢谢
服务器上的应用程序如下:
#include
#include
#include
#include
#include
#include
#include
#define MY_PORT 2100
void main()
{
int sock_serv,new_fd;
unsigned int sin_size;
struct sockaddr_in host_addr,remo_addr;
sock_serv=socket(AF_INET,SOCK_STREAM,0);/*主机建立socket*/
if(sock_serv!=-1)
printf("Socket created OKn");
else
exit(1);
host_addr.sin_family=AF_INET;/*初始化主机socket地址*/
host_addr.sin_addr.s_addr=htonl(INADDR_ANY);
host_addr.sin_port=htons(MY_PORT);
bzero(&(host_addr.sin_zero),8);
if(bind(sock_serv,(struct sockaddr *)&host_addr,sizeof(struct sockaddr))!=-1)
printf("Binded OKn");
else
exit(1);
if(listen(sock_serv,1)!=-1)
printf("listeningn");
else
exit(1);
while(1){
sin_size = sizeof(struct sockaddr);
new_fd = accept(sock_serv, (struct sockaddr *)&remo_addr, &sin_size);
if(new_fd!=-1){
printf("Acepted OKn");
printf("server: got connection from %sn", inet_ntoa(remo_addr.sin_addr));}
else
exit(1);
}
}
客户端上的程序如下:
#include
#include
#include
#include
#include
#include
#include
void main()
{
int sock_cli;
struct sockaddr_in serv_addr;
sock_cli=socket(AF_INET,SOCK_STREAM,0);
if(sock_cli!=-1)
printf("Socket created OKn");
else exit(1);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=2100;
serv_addr.sin_addr.s_addr=htonl(inet_addr("127.0.0.1"));
bzero(&(serv_addr.sin_zero),8);
if(connect(sock_cli,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))!=-1){
printf("Connected OKn");
}
else exit(1);
}
为调试程序,在linux上开两个终端,分别运行服务器程序和客户端程序,以实现本机发送,本机接收。但服务器没有客户端连接,客户端也连不上服务器。郁闷啊!希望大虾指点迷津,谢谢
|
客户端serv_addr.sin_port=2100;为什么不htons?
|
1. 使用 bzero 函数处理 struct sockaddr_in 结构
在你给 struct sockaddr_in 结构填充数据之前,使用 bzero 函数
例如,在你的 server 程序中,
。。。
bzero(&host_addr, sizeof(hostaddr)) ; /*加上这一行*/
host_addr.sin_family=AF_INET;/*初始化主机socket地址*/
。。。
同样的问题出现在你的客户端程序。
2。 使用htonl 或htons函数使你的程序使用 network endianness
在你的客户端程序中,serv_addr.sin_port=2100; 应该该为 serv_addr_port = htons(2100);
3. inet_addr 函数返回的是 network endianness 不需要 htonl
你应该把你错误信息贴出来! 1,2 错误可能是致命的,导致你的程序不能正常工作,3不是。
在你给 struct sockaddr_in 结构填充数据之前,使用 bzero 函数
例如,在你的 server 程序中,
。。。
bzero(&host_addr, sizeof(hostaddr)) ; /*加上这一行*/
host_addr.sin_family=AF_INET;/*初始化主机socket地址*/
。。。
同样的问题出现在你的客户端程序。
2。 使用htonl 或htons函数使你的程序使用 network endianness
在你的客户端程序中,serv_addr.sin_port=2100; 应该该为 serv_addr_port = htons(2100);
3. inet_addr 函数返回的是 network endianness 不需要 htonl
你应该把你错误信息贴出来! 1,2 错误可能是致命的,导致你的程序不能正常工作,3不是。
|
1.bzero函数应该在你对serv_addr初始化之前调用。这是最主要的问题,你每次都在赋值以后又调用bzero清零了,等于没有赋值。:)
服务器端:
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(MY_PORT);
客户端:
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(MY_PORT);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
2. listen的原型为listen(int fd, int backlog)
建议以后在编程序过程中,不要显式指定 backlog的大小,因为listen函数拥有两个queue,一个是An complete connection queue,另一个是A complete connection queue。对于backlog的大小表示的含义没有正式的说法,一般定义为这两个queue的元素数目之和。但是在不同的平台上backlog表示的意义不一样,例如,backlog=0,在MacOS 10.2.6上表示1,在Linux2.4.7上表示3;backlog=1,在MacOS 10.2.6上表示2,在Linux2.4.7上表示4。
所以,下次写程序时候,用环境变量LISTENQ代替具体的backlog数值,采用如下调用:
listen(sock_serv,LISTENQ);
或者定义自己的Listen函数,将listen函数封装在内,如下:
void
Listen(int fd, int backlog)
{
char *ptr;
if((ptr=getenv("LISTENQ")) != NULL)
backlog=atoi(ptr);
if(listen(fd,backlog)
服务器端:
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(MY_PORT);
客户端:
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(MY_PORT);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
2. listen的原型为listen(int fd, int backlog)
建议以后在编程序过程中,不要显式指定 backlog的大小,因为listen函数拥有两个queue,一个是An complete connection queue,另一个是A complete connection queue。对于backlog的大小表示的含义没有正式的说法,一般定义为这两个queue的元素数目之和。但是在不同的平台上backlog表示的意义不一样,例如,backlog=0,在MacOS 10.2.6上表示1,在Linux2.4.7上表示3;backlog=1,在MacOS 10.2.6上表示2,在Linux2.4.7上表示4。
所以,下次写程序时候,用环境变量LISTENQ代替具体的backlog数值,采用如下调用:
listen(sock_serv,LISTENQ);
或者定义自己的Listen函数,将listen函数封装在内,如下:
void
Listen(int fd, int backlog)
{
char *ptr;
if((ptr=getenv("LISTENQ")) != NULL)
backlog=atoi(ptr);
if(listen(fd,backlog)