关于linux socket编程的问题

我好郁闷,弄了一晚上,不知道这个socket程序错在哪,客户端运行时总是提示connecterror;connectrefused,请高手帮我看看那里出问题了,万分感谢!... 我好郁闷,弄了一晚上,不知道这个socket程序错在哪,客户端运行时总是提示connect error;connect refused,请高手帮我看看那里出问题了,万分感谢!(我实在找不出错误的原因了,极度纠结中,在线等答案!!)贴上代码把!
ser.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#define PORT 3562
int main()
{
int ser_fd,cli_fd;
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=INADDR_ANY;
bzero(&addr.sin_zero,8);
ser_fd=socket(AF_INET,SOCK_STREAM,0);
int ret=0;
if((ret=bind(ser_fd,(struct sockaddr*)&addr,sizeof(struct sockaddr))<0))
{
perror("bind error! ");
return 0;
}
listen(ser_fd,10);
char* buf;
//while(1)
{
cli_fd=accept(ser_fd,NULL,NULL);
/* if(cli_fd<0)
{
perror("accept error!\n");
return 0;
} */
sleep(10);
recv(cli_fd,buf,strlen(buf),0);
printf("receive from client:%s",buf);
}
return 0;
}

cli.c
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#define PORT 3662

int main() {
int ser_fd,cli_fd;
struct sockaddr_in ser_addr,cli_addr;
struct in_addr s;
// char* ip="127.0.0.1";
// inet_pton(AF_INET,ip,(void*)&s);
//���ÿͻ��˵�ַ,�Ա�bind
//memset(&cli_addr,0,sizeof(struct sockaddr_in));
cli_addr.sin_family=AF_INET;
cli_addr.sin_port=htons(3325);
cli_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&cli_addr.sin_zero,8);
cli_fd=socket(AF_INET,SOCK_STREAM,0);

ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(PORT);
ser_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&ser_addr.sin_zero,8);

//bind ser_fd and cli_addr
int ret;
if((ret=bind(cli_fd,(struct sockaddr*)&cli_addr,sizeof(cli_addr))<0))
{
perror("bind error! \n");
return 0;
}
// while(1)
// {
if((ret=connect(cli_fd,(struct sockaddr*)&ser_addr,sizeof(ser_addr))<0))
{
perror("connect error!\n");
return 0;
}
char* buf="wanghe";
send(cli_fd,buf,strlen(buf),0);
// }
}
嗯,是的,自己犯傻了,客户端的端口是错的,非常感谢大家的帮助,但是现在的问题是:服务器端收到了来自客户端的信息,但是收到的却是一大串乱码,谁知道是什么原因阿?

“爱上夜色深沉”,谢谢你的回答,但貌似你的connect函数才是错的,我那个应该是正确的吧,connect的第二个和第三个参数应该是针对服务器的地址吧,呵呵
展开
 我来答
creater2012
2012-04-09 · TA获得超过156个赞
知道小有建树答主
回答量:311
采纳率:0%
帮助的人:154万
展开全部
connect出现错误,可能是服务器端没有运行该服务器进程。或者你指定的端口不对,或者对方防火墙限制。还可能是本地网卡没开启。
给你几个手段:
0.看是否启动网卡 service network status 然后 service network start
1. netstat -a | grep 3562 检测你的服务器是否处于LISTEN
2. 启动客户端后,netstat -a | grep tcp 检测你的服务器和客户端是否处于ESTABLISH
3.可以在不同的机器上运行程序。开启tcpdump host +本地主机IP and tcp观察你的数据包流向
4. 客户端最好不用bind,交给内核来自动赋予临时端口和通配地址。
基本上就可以找出问题所在。
爱上夜色深沉
2012-04-09 · TA获得超过459个赞
知道小有建树答主
回答量:377
采纳率:100%
帮助的人:346万
展开全部
亲,你的客户端和服务端都是在本地运行吗,如果是这样,你的server绑定的端口是3562,那么你的client需要发送到的端口也必须是3562才行啊,否则server怎么收的到啊,然后client发送的IP是本机所以不是INADDR_ANY而是127.0.0.1,还有connect也错了,修改如下
cli.c
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#define PORT 3562

int main() {
int cli_fd;
struct sockaddr_in cli_addr;
cli_fd=socket(AF_INET,SOCK_STREAM,0);
cli_addr.sin_family=AF_INET;
cli_addr.sin_port=htons(PORT);
cli_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&cli_addr.sin_zero,8);
int ret;
if((ret=bind(cli_fd,(struct sockaddr*)&cli_addr,sizeof(cli_addr))<0))
{
perror("bind error! \n");
return 0;
}
while(1)
{
if((ret=connect(cli_fd,(struct sockaddr*)&cli_addr,sizeof(cli_addr))<0))
{
perror("connect error!\n");
return 0;
}
char* buf="wanghe";
send(cli_fd,buf,strlen(buf),0);
}
}
其他小问题自己弄下吧,我是目测的,没测试
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
相思丶猫2C
2012-04-09 · TA获得超过1198个赞
知道小有建树答主
回答量:1432
采纳率:50%
帮助的人:960万
展开全部
是不是端口没有设置好?
例如:
服务器在3333监听,
客户端需要在connect的ser_addr的端口号设为3333。

int n = recv
buff[n] = '\0';
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式