LINUX下C/S编程问题
本人因需要,需要写一个linux下的双机通讯程序,用tcp协议传送数据。
服务器上的应用程序如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <linux/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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 OK\n");
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 OK\n");
else
exit(1);
if(listen(sock_serv,1)!=-1)
printf("listening\n");
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 OK\n");
printf("server: got connection from %s\n", inet_ntoa(remo_addr.sin_addr));}
else
exit(1);
}
}
客户端上的程序如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <linux/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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 OK\n");
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 OK\n");
}
else exit(1);
}
为调试程序,在linux上开两个终端,分别运行服务器程序和客户端程序,以实现本机发送,本机接收。但服务器没有客户端连接,客户端也连不上服务器。郁闷啊!希望大虾指点迷津,谢谢
问题点数:30、回复次数:13Top
1 楼fierygnu(va_list)回复于 2006-03-09 13:43:46 得分 10
客户端serv_addr.sin_port=2100;为什么不htons?Top
2 楼Old123()回复于 2006-03-09 16:38:50 得分 0
试过了,还是不行Top
3 楼fierygnu(va_list)回复于 2006-03-09 17:02:32 得分 0
inet_addr返回的就是网络字节序,不能再htonl了 :)Top
4 楼bm1408(向va_list学习~不用VC好多年~)回复于 2006-03-09 18:28:20 得分 0
查看一下你地址的IP地多少?Top
5 楼Old123()回复于 2006-03-09 19:43:57 得分 0
我的地址是192.168.1.101,这个我也试过了,不行啊!
Top
6 楼fierygnu(va_list)回复于 2006-03-09 19:47:34 得分 0
?还不行?Top
7 楼Old123()回复于 2006-03-11 00:35:52 得分 0
是的啊,太郁闷了,请达人赐教Top
8 楼fierygnu(va_list)回复于 2006-03-11 01:41:25 得分 0
inet_addr返回的就是网络字节序,不能再htonl了 :)
==
这个改了吗?Top
9 楼FindFullMoon(寻找自己)回复于 2006-03-11 03:37:37 得分 0
要不然看看 防火墙?
也不一定非要是程序本身的问题吧.Top
10 楼linuxghs()回复于 2006-03-19 19:11:36 得分 0
serv_addr.sin_port=2100; ?????
看看吧Top
11 楼Jamesonang(珍惜生命,远离网络)回复于 2006-03-20 13:42:40 得分 10
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不是。Top
12 楼bjpy2005(冰城的神话)回复于 2006-03-22 03:11:27 得分 10
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) < 0)
err_sys("listen error");
}
Top
13 楼Old123()回复于 2006-03-25 09:46:49 得分 0
问题解决,多谢大家的鼎力相助Top




