Linux socket编程,connect失败.

Mark_fish 2015-07-29 11:38:06
在VMWARE下进行的。server到listen 没有问题,client 在connect时候提示fail。可以ping通127.0.0.1 请大神帮忙看看
/* client */

#include<string.h>
#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<sys/time.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>

#define PORT 6000
#define MAX_SIZE 1420
using namespace std;

void seconds_sleep(unsigned seconds){
struct timeval tv;
int errno;
tv.tv_sec=seconds;
tv.tv_usec=0;
int err;
do{
err=select(0,NULL,NULL,NULL,&tv);
}while(err<0 && errno==0);
}


int main()
{
int confd;
int recbytes;
socklen_t sin_size;
char send_buff[MAX_SIZE] = {0};
char recv_buff[MAX_SIZE] = {0};
char ntoa;
struct sockaddr_in s_add , c_add ;
timeval *begin;
cout<<"Client start."<<endl;
strcpy (send_buff,"Hi,I am mark. ");

if ( confd = socket( AF_INET , SOCK_STREAM , 0) == -1 ) // create socket
{
cout<<"Socket fail!"<<endl;
return -1;
}
cout<<"Socket OK!"<<endl;

bzero( &s_add , sizeof(struct sockaddr_in)); // init s_add
s_add.sin_family = AF_INET ;
s_add.sin_addr.s_addr = inet_addr("127.0.0.1");
// ntoa = (s_add.sin_addr);
s_add.sin_port = htons(PORT);
cout<<"s_addr = "<<s_add.sin_addr.s_addr<<",port:"<<s_add.sin_port<<endl;

if (-1 == connect( confd , (struct sockaddr *)(&s_add),sizeof(struct sockaddr)))// connect
{
cout<<"connect fail!"<<endl;
return -1;
}
cout<<"Connected!"<<endl;
if ( -1 == send( confd , send_buff , MAX_SIZE , 0 ) ) // send
{
cout<<"Send fail!"<<endl;
return -1;
}
if ( -1 == recv( confd , recv_buff , MAX_SIZE , 0 ) ) // recv
{
cout<<"recv fail!"<<endl;
return -1;
}
recv_buff[MAX_SIZE-1] ='\0';
cout<<"recv msg :"<<recv_buff<<endl; // output recv msg


close(confd);

return 0;
}


/* server */

#include<string.h>
#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<sys/time.h>
#include<unistd.h>
#include<arpa/inet.h>

#define PORT 6000
#define MAX_SIZE 1420
#define back_log 1000 //max linking number
using namespace std;
int main()
{
int listenfd,confd; // sockfd
struct sockaddr_in s_add,c_add;
socklen_t sin_size;
timeval *server_time;
char send_buff[MAX_SIZE] = {0};
char recv_buff[MAX_SIZE] = {0};
strcpy(send_buff,"Welcome to mark's server!");

if ( (listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1 )// create socket
{
cout<<"Socket fail!"<<endl;
return -1;
}
cout << "Socket OK!"<<endl;
bzero(&s_add,sizeof(sockaddr_in));
s_add.sin_family = AF_INET;// IPV4
s_add.sin_port = htons(PORT);
s_add.sin_addr.s_addr = htonl(INADDR_ANY);//
// s_add.sin_addr.s_addr = inet_addr("0.0.0.0");//
if (-1 == bind( listenfd , (struct sockaddr*)(&s_add) , sizeof(struct sockaddr)))// bind
{
cout<<"Bind port fail!"<<endl;
return -1;
}
cout<<"Bind port succeed!"<<endl;
if (-1 == listen( listenfd , back_log ) )// listen
{
cout<<"Listen fail!"<<endl;
return -1;
}
cout<<"Listen OK!"<<endl;
// cout<<"s_addr = "<<s_add.sin_addr.s_addr<<",port:"<<s_add.sin_port<<endl;
while (true)
{
sin_size = sizeof(struct sockaddr_in);
if ( ( confd = accept( listenfd , (struct sockaddr*)(&c_add) ,&sin_size )) == -1 )
{
cout<<"Accept fail!"<<endl;
return -1;

cout<<"Accepted!"<<endl;
cout<<"connection from:"<<ntohl(c_add.sin_addr.s_addr)<<" port:"<<ntohs(c_add.sin_port)<<endl;
gettimeofday(server_time,NULL);
cout<<"Now time is:"<<server_time->tv_sec<<"s "<<server_time->tv_usec<<"us"<<endl;
while (-1 != recv(confd,recv_buff,MAX_SIZE,0))
{
send(confd,send_buff,MAX_SIZE,0);
recv_buff[MAX_SIZE-1] = '\0';
cout<<"recv msg:"<<recv_buff<<endl;
}

}
close(confd);
}



}
...全文
349 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
YinPSoft 2015-08-12
  • 打赏
  • 举报
回复
客户端里这一段: if ( confd = socket( AF_INET , SOCK_STREAM , 0) == -1 ) // create socket { cout<<"Socket fail!"<<endl; return -1; } if条件中的写法导致confd最终是一个boolean值,不是socket fd 应该写成: if ( (confd = socket( AF_INET , SOCK_STREAM , 0)) == -1 ) { cout<<"Socket fail!"<<endl; return -1; }
FightForProgrammer 2015-07-29
  • 打赏
  • 举报
回复
看看错误的返回值是什么,然后根据返回值的信息找到错误原因
hanqingwu 2015-07-29
  • 打赏
  • 举报
回复
sin_size = sizeof(struct sockaddr_in); 不对 应该是 sizeof(struct sockaddr)
Mark_fish 2015-07-29
  • 打赏
  • 举报
回复
引用 1 楼 FightForProgrammer 的回复:
看看错误的返回值是什么,然后根据返回值的信息找到错误原因
ERRNO 88 /* Socket operation on non-socket */ 但是socket生成并没有什么问题。。。

18,773

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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