当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 求高手帮忙!! 网络编程。。。套接字会话程序。。。
帖子发表于 : 2010-04-27 21:05 

注册: 2008-11-06 22:09
帖子: 106
送出感谢: 1
接收感谢: 0 次
程序代码如下,
//client.c如下,tcp会话程序 client端 ,连接到服务器
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <linux/in.h>

#define RECV_PORT 2000
#define SEND_PORT 3000

int sock_client;

struct sockaddr_in addr_server;
struct sockaddr_in addr_client;

int createSocket()
{
int ret;
sock_client=socket(AF_INET,SOCK_STREAM,0);
// getchar();
if(sock_client==-1)
{
printf("failed to create socket!\n");
return -1;
}
printf("create socket ok,the socket is %d\n",sock_client);

memset(&addr_client,0,sizeof(struct sockaddr_in));
addr_client.sin_family=AF_INET;
addr_client.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
addr_client.sin_port=htons(SEND_PORT);
if((ret=bind(sock_client,(struct sockaddr *)&addr_client ,sizeof(addr_client)))== -1)
{
printf("bind error!\n");
return -1;
}
printf("%d\n",ret);
return 0;
}

int connectServer()
{
int ret;
getchar(); getchar();
if( (ret=connect(sock_client,(struct sockaddr *)&addr_server,sizeof(addr_server)))==-1)
{
printf("failed to connect...\n");
printf("%d",ret);
close(sock_client);
return -1;
}
printf("%d",ret);
printf("connect OK!\n");
return 0;
}

int tcpSend(char data[])
{
int length;
length=send(sock_client,data,strlen(data),0);
if(length<=0)
{
printf("send data error!\n");
shutdown(sock_client,SHUT_RDWR);
return -1;
}
return 0;
}

int main()
{
memset(&addr_server,0,sizeof(struct sockaddr_in));
addr_server.sin_family=AF_INET;
addr_server.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
addr_server.sin_port=htons(RECV_PORT);

char buff[80];
int num,i;
createSocket();
// while(createSocket()==-1);
// connectServer();
while(connectServer()==-1);

printf("press any key to send!\n");
getchar();

for(;;)
{
printf("Input the number of message to send:(0- exit)");
memset(buff,0,80);
scanf("%d",&num);
if(num<=0) break;

for(i=0;i<num;i++)
{
sprintf(buff,"data%d",i);
printf("%s\n",buff);
tcpSend(buff);
//sleep(10);
}
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//server.c如下,tcp会话 server端,监听 请求
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <linux/in.h>

#define RECV_PORT 2000
#define SEND_PORT 3000

int sock_server,sock_new;
struct sockaddr_in addr_server,addr_client;
unsigned int addrlen;

int createSocket()
{
sock_server=socket(AF_INET,SOCK_STREAM,0);
if(sock_server==-1)
{
printf("failed to create socket!\n");
return -1;
}
printf("create socket ok,the socket is %d\n",sock_server);

memset(&addr_server,0,sizeof(struct sockaddr_in));
addr_server.sin_family=AF_INET;
addr_server.sin_port=RECV_PORT;
addr_server.sin_addr.s_addr=htonl(INADDR_LOOPBACK);

if(bind(sock_server,(struct sockaddr *)&addr_server, sizeof(addr_server))==-1)
{
printf("bind error\n");
return -1;
}
return 0;
}

int connectProcess()
{
char buff[80];
addrlen=sizeof(struct sockaddr_in);
if(listen(sock_server,5)<0)
{
printf("Listen error!\n");
return -1;
}
printf("Litening...\n");

for(;;)
{
sock_new=accept(sock_server,(struct sockaddr *)&addr_client,&addrlen);
printf("sock_new is %d\n",sock_new);
printf("connect ok \n");
printf("wait for receive... \n");
for(;;)
{
memset(buff,0,80);
if(recv(sock_new,buff,80,0)<=0)
break;

printf("%s\n",buff);
}
}
return 0;
}

int main()
{

if(createSocket()==-1)
return -1;

if(connectProcess()==-1)
return -1;

return 0;
}


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 求高手帮忙!! 网络编程。。。套接字会话程序。。。
帖子发表于 : 2010-04-27 21:11 

注册: 2008-11-06 22:09
帖子: 106
送出感谢: 1
接收感谢: 0 次
补充: 以上 server 和 client 在同一台机器上 调试, 两个程序都 创建套接字3, 会不会是因为这个冲突导致 运行失败?。。。还有,防火墙我是关的。。。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 求高手帮忙!! 网络编程。。。套接字会话程序。。。
帖子发表于 : 2010-04-28 10:33 

注册: 2008-11-06 22:09
帖子: 106
送出感谢: 1
接收感谢: 0 次
问题解决,在进程server中, 我虽然绑定的端口号是2000, 但实际运行时发现根本不是2000,而是一个随机数字8270,所以我把 client.c中的 目标端口修改为8270,编译、运行,连接成功!!!搞了半天,原来是端口号的问题!!!

但我有个疑问:
在server进程中, 我明明绑定的是 2000,并且进程报告绑定成功(返回 0),可为什么实际运行的端口号不是我绑定的2000呢???
难道是因为(1)端口2000已经使用,我用 sudo netstat -velp |grep 2000或者sudo netstat -avep没发现此端口的使用信息。如果在使用中,会返回错误阿?。。。难道不返回? (2)分配端口有固定规则,我违反了规则,没有获得 申请的端口号。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 求高手帮忙!! 网络编程。。。套接字会话程序。。。
帖子发表于 : 2010-04-28 10:42 

注册: 2008-11-06 22:09
帖子: 106
送出感谢: 1
接收感谢: 0 次
我日啊,让大家见笑了!!! 其实原因很简单:
server.c中“addr_server.sin_port=RECV_PORT;” 这句应该修改为
“addr_server.sin_port=htons(RECV_PORT);” ,少了个类型转换,造成端口号错误。。。。。泪奔阿。。。

:em06 :em20


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:Google Feedfetcher 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译