socket 连接问题。

louqyand 2011-09-04 04:06:53
写了一个socket连接程序,但是不知道为什么一直出错误。代码如下:
服务端:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <resolv.h>
#include <malloc.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<fcntl.h>


//服务器通信函数。
int main()
{
int sersocket;//服务器通信socket
int selfclisocket,selfsersocket;//进程通信socket
int self_port = 7779;//进程通信端口
int ser_port = 3325;//服务器通信端口
char * self_ip = "127.0.0.1";//进程通信IP
char * ser_ip = "192.168.1.9";//服务器IP
//puts(ip);
fd_set rfds;
char buf[MAXBUF+1];
char buff[MAXBUF+1];
int retval;
int maxfd;
int ret;
int len;
int i_size; //指向存有addr地址长度的整形数
int check;
struct timeval tmOut;
tmOut.tv_sec = 0;
tmOut.tv_usec = 0;
struct sockaddr_in selfser_addr;
struct sockaddr_in selfcli_addr;


i_size=sizeof(struct sockaddr_in);

selfsersocket=socket(AF_INET,SOCK_STREAM,0);
if(selfsersocket == -1)
{
printf("Process socket error!\n");
return -1;
}

bzero(&selfser_addr,i_size);
selfser_addr.sin_family=AF_INET; //地址家族 AF_INET代表TCP/IP协议
selfser_addr.sin_port=htons(self_port); //存储端口号
selfser_addr.sin_addr.s_addr=INADDR_ANY; //存储IP地址

if((ret = bind(selfsersocket,(struct sockaddr*)&selfser_addr,sizeof(struct sockaddr_in))) == -1)
{
printf ("process SERVER Binding failed\n");
return -1;
}
if (listen(selfsersocket, 1) == -1) printf("process SERVER Error listening on socket.\n");
printf("process server start!\n");
if((selfclisocket=accept(selfsersocket,(struct sockaddr*)&selfcli_addr,&i_size)) == -1)
{
printf("process client disconnected!\n");
return -1;
}
else
printf("process server: got connection from %s, port %d, socket %d\n",inet_ntoa(selfcli_addr.sin_addr),ntohs(selfcli_addr.sin_port), selfclisocket);
}


客户端:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <resolv.h>
#include <malloc.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<fcntl.h>
#define MAXBUF 256

int con_ser()
{
int selfclisocket;
char * self_ip="127.0.0.1";
int read_fd,write_fd;//文件句柄
char buf[MAXBUF+1];
char buff[MAXBUF+1];
int self_pot = 7734;
char * read_file = "../atom";
int retval;
int maxfd;
int ret;
int len;
int i_size; //指向存有addr地址长度的整形数
int check;
fd_set rfds;
struct timeval tmOut;
tmOut.tv_sec = 0;
tmOut.tv_usec = 100;

struct sockaddr_in self_addr;

i_size=sizeof(struct sockaddr_in);

selfclisocket = socket(AF_INET,SOCK_STREAM,0);
if(selfclisocket == -1)
{
printf("get socket error!\n");
return -1;
}
else printf("socket success!\n");

bzero(&self_addr,sizeof(self_addr));
self_addr.sin_family = AF_INET;
self_addr.sin_port=htons(self_pot); //存储端口号
//inet_aton(self_ip,(struct in_addr *) &self_addr.sin_addr.s_addr);
self_addr.sin_addr.s_addr=INADDR_ANY;


check = connect(selfclisocket,(struct sockaddr *)&self_addr,i_size);
sleep(1);
if(check == -1)
{
perror("connect process server error!\n");
return -1;
}
else printf("connect success!!\n");

read_fd = open(read_file,O_RDWR);//argv [4]为读取的文件的路径
if(read_fd == -1)
perror("open read file");
write_fd = read_fd;
}

int main(int argc ,char * argv[])
{

if (con_ser() == -1)
{
printf ("con_ser error\n");
return 0;
}

return 0;
}

请各位大大指教。。
感激不尽。。
...全文
126 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yong_f 2011-09-06
  • 打赏
  • 举报
回复
防火墻的问题关了就好了
太乙 2011-09-06
  • 打赏
  • 举报
回复
$ cat server.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>

int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
perror("[ERROR]");
return -1;
}
struct sockaddr_in addr;
pid_t pid;
addr.sin_family = AF_INET;
addr.sin_port = htons(9999);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (-1 == bind(sockfd, (struct sockaddr*)& addr, sizeof(struct sockaddr_in)))
{
perror("[ERROR]");
return -1;
}
if ( -1 == listen(sockfd, 10))
{
perror("[ERROR]");
return -1;
}
struct sockaddr_in client_addr;
int len = sizeof(client_addr);
int connect_fd = accept(sockfd, (struct sockaddr*)&client_addr, &len);
if (connect_fd == -1)
{
perror("[ERROR]");
break;
}
close(connect_fd);
close(sockfd);
return 0;
}

$ cat client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
perror("[ERROR]");
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(9999);
inet_aton("127.0.0.1", &addr.sin_addr);
if (-1 == connect(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)))
{
perror("[ERROR]");
return -1;
}
close(sockfd);
return 0;
}
Wenxy1 2011-09-06
  • 打赏
  • 举报
回复
记得把防火墙关闭.
或者清空所有的规则试试: #iptables -F
太乙 2011-09-06
  • 打赏
  • 举报
回复
晕,你的client端:
self_addr.sin_addr.s_addr=INADDR_ANY;

这也行?不指定服务器的ip?开玩笑捏?
太乙 2011-09-06
  • 打赏
  • 举报
回复
服务器启动以后,lz可以看看是否服务器进程在监听相应的端口:

sudo lsof -i:3325


还有使用INADDR_ANY的时候需要转换为网络字节序列,使用htonl转换下
dclchj 2011-09-04
  • 打赏
  • 举报
回复
是的,UBUNTU10.10 gcc
louqyand 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dclchj 的回复:]

哦对了,可能LZ需要换个port再编译被被,原来的端口暂时被限制了,一段时间后才能被再次使用的。
[/Quote]试过好多次了。。估计你再换个端口试试。。看看出错不。。
另。。你是在linux下面编译的吧。。
louqyand 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 justkk 的回复:]

客户端连接时应该指定服务器的端口号,而不是自己的
[/Quote]这个没错。。端口号是一致的
justkk 2011-09-04
  • 打赏
  • 举报
回复
客户端连接时应该指定服务器的端口号,而不是自己的
dclchj 2011-09-04
  • 打赏
  • 举报
回复
哦对了,可能LZ需要换个port再编译被被,原来的端口暂时被限制了,一段时间后才能被再次使用的。
dclchj 2011-09-04
  • 打赏
  • 举报
回复
是吗?我这成功的。看你我复制过来的代码:
#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <stdlib.h>

#include <resolv.h>

#include <malloc.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/wait.h>

#include <sys/time.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include<fcntl.h>
#define MAXBUF 256



//·þÎñÆ÷ÍšÐź¯Êý¡£

int main()

{

int sersocket;//·þÎñÆ÷ÍšÐÅsocket

int selfclisocket,selfsersocket;//œø³ÌÍšÐÅsocket

int self_port = 7779;//œø³ÌÍšÐŶ˿Ú

int ser_port = 3325;//·þÎñÆ÷ÍšÐŶ˿Ú

char * self_ip = "127.0.0.1";//œø³ÌÍšÐÅIP

char * ser_ip = "192.168.1.9";//·þÎñÆ÷IP

//puts(ip);

fd_set rfds;

char buf[MAXBUF+1];

char buff[MAXBUF+1];

int retval;

int maxfd;

int ret;

int len;

int i_size; //ÖžÏòŽæÓÐaddrµØÖ·³€¶ÈµÄÕûÐÎÊý

int check;

struct timeval tmOut;

tmOut.tv_sec = 0;

tmOut.tv_usec = 0;

struct sockaddr_in selfser_addr;

struct sockaddr_in selfcli_addr;





i_size=sizeof(struct sockaddr_in);



selfsersocket=socket(AF_INET,SOCK_STREAM,0);

if(selfsersocket == -1)

{

printf("Process socket error!\n");

return -1;

}



bzero(&selfser_addr,i_size);

selfser_addr.sin_family=AF_INET; //µØÖ·ŒÒ×å AF_INETŽú±íTCP/IPЭÒé

selfser_addr.sin_port=htons(self_port); //ŽæŽ¢¶Ë¿ÚºÅ

selfser_addr.sin_addr.s_addr=INADDR_ANY; //ŽæŽ¢IPµØÖ·



if((ret = bind(selfsersocket,(struct sockaddr*)&selfser_addr,sizeof(struct sockaddr_in))) == -1)

{

printf ("process SERVER Binding failed\n");

return -1;

}

if (listen(selfsersocket, 1) == -1) printf("process SERVER Error listening on socket.\n");

printf("process server start!\n");

if((selfclisocket=accept(selfsersocket,(struct sockaddr*)&selfcli_addr,&i_size)) == -1)

{

printf("process client disconnected!\n");

return -1;

}

else

printf("process server: got connection from %s, port %d, socket %d\n",inet_ntoa(selfcli_addr.sin_addr),ntohs(selfcli_addr.sin_port), selfclisocket);

}


*********client****************
#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <stdlib.h>

#include <resolv.h>

#include <malloc.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/wait.h>

#include <sys/time.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include<fcntl.h>

#define MAXBUF 256



int con_ser()

{

int selfclisocket;

char * self_ip="127.0.0.1";

int read_fd,write_fd;//ÎÄŒþŸä±ú

char buf[MAXBUF+1];

char buff[MAXBUF+1];

int self_pot = 7779;

char * read_file = "../atom";

int retval;

int maxfd;

int ret;

int len;

int i_size; //ÖžÏòŽæÓÐaddrµØÖ·³€¶ÈµÄÕûÐÎÊý

int check;

fd_set rfds;

struct timeval tmOut;

tmOut.tv_sec = 0;

tmOut.tv_usec = 100;



struct sockaddr_in self_addr;



i_size=sizeof(struct sockaddr_in);



selfclisocket = socket(AF_INET,SOCK_STREAM,0);

if(selfclisocket == -1)

{

printf("get socket error!\n");

return -1;

}

else printf("socket success!\n");



bzero(&self_addr,sizeof(self_addr));

self_addr.sin_family = AF_INET;

self_addr.sin_port=htons(self_pot); //ŽæŽ¢¶Ë¿ÚºÅ

//inet_aton(self_ip,(struct in_addr *) &self_addr.sin_addr.s_addr);

self_addr.sin_addr.s_addr=INADDR_ANY;





check = connect(selfclisocket,(struct sockaddr *)&self_addr,i_size);
perror("connect");

sleep(1);

if(check == -1)

{

perror("connect process server error!\n");

return -1;

}

else printf("connect success!!\n");



read_fd = open(read_file,O_RDWR);//argv [4]Ϊ¶ÁÈ¡µÄÎÄŒþµÄ·Ÿ¶

if(read_fd == -1)

perror("open read file");

write_fd = read_fd;

}



int main(int argc ,char * argv[])

{



if (con_ser() == -1)

{

printf ("con_ser error\n");

return 0;

}



return 0;

}


终端运行结果:
socket success!
connect: Success
connect success!!
open read file: No such file or directory
con_ser error



process server start!
process server: got connection from 127.0.0.1, port 53098, socket 4
louqyand 2011-09-04
  • 打赏
  • 举报
回复
将这两个改了还是不行。。
一直connection refused[Quote=引用 1 楼 dclchj 的回复:]

客户端端口写错了大哥:
int self_pot = 7734;

改为 7779

另外好像服务器端少了 #define MAXBUF 256

这两个地方改了后,连接是成功的。
[/Quote]
dclchj 2011-09-04
  • 打赏
  • 举报
回复
客户端端口写错了大哥:
int self_pot = 7734;

改为 7779

另外好像服务器端少了 #define MAXBUF 256

这两个地方改了后,连接是成功的。

23,115

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧