当前位置: 技术问答>linux和unix
socket问题(跪求答案)
来源: 互联网 发布时间:2016-08-20
本文导语: 我在写socket时出了一个问题:Transport endpoint is already connected ,请路过的大侠们指教! 我的程序: #include #include #include #include #include #include #include #include #include #include int port=12345; void *server(); int...
我在写socket时出了一个问题:Transport endpoint is already connected ,请路过的大侠们指教!
我的程序:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int port=12345;
void *server();
int socket_descriptor;//socket描述符
int main()
{
pthread_t thread_id;
int sin_len;//字节数
char message[256];
struct sockaddr_in serv_addr;//保存socket信息
int connect_rc,close_rc;
ssize_t send_rc;
long save_file_flags;
// printf("Waiting for data from servern");
//初始化协议族,ip地址,端口号
bzero(&serv_addr,sizeof((serv_addr))); //清0
serv_addr.sin_family=AF_INET;//初始化协议族
serv_addr.sin_addr.s_addr=htons(INADDR_ANY);//初始化IP
serv_addr.sin_port=htons(port);//初始化端口
sin_len=sizeof(serv_addr);
//Create a TCP socket and bind it to the port
socket_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(socket_descriptor==-1)
{
perror("socket call failed");
exit(errno);
}
pthread_create(&thread_id,NULL,&server,NULL);//生成子线程
usleep(20);
connect_rc=connect(socket_descriptor,(struct sockaddr *)&serv_addr,sin_len);
if(connect_rc==-1)
{
perror("connect call failed");
exit(errno);
}
while(1)
{
// sleep(1);
scanf("%s",message);
send_rc=send(socket_descriptor,message,sizeof(message),0);
if(send_rc==-1)
{
perror("send call failed");
exit(errno);
}
// printf("Response from server:%sn",message);
if(strncmp(message,"stop",4)==0)
{
printf("Sender has told me to end the connectionn");
break;
}
}
close_rc=close(socket_descriptor);
if(close_rc==-1)
{
perror("close call failed");
exit(errno);
}
exit (0);
}
void* server()
{
int sin_len;
char message[256];
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
int client_fd;
int bind_rc,close_rc,listen_rc;
ssize_t recv_rc;
int BACKLOG=20;
pthread_t thread_id;
printf("Wait for data from clientn");
//初始化协议族,ip地址,端口号
bzero(&(my_addr),sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_addr.s_addr=htons(INADDR_ANY);
my_addr.sin_port=htons(port);
sin_len=sizeof(my_addr);
//Create a TCP socket and bind it to the port
#if 0
socket_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(socket_descriptor==-1)
{
perror("socket call failed");
exit(errno);
}
// pthread_create(thread_id,NULL,&client,NULL);
#endif
bind_rc=bind(socket_descriptor,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
if(bind_rc==-1)
{
perror("bind call failed");
exit(errno);
}
listen_rc=listen(socket_descriptor,BACKLOG);
if(listen_rc==-1)
{
perror("listen call failed");
exit(errno);
}
if((client_fd=accept(socket_descriptor,(struct sockaddr *)&remote_addr,&sin_len))==-1)
{
perror("accept call failed");
exit(errno);
}
// close(socket_descriptor);
//循环接受信息
while(1)
{
usleep(20);
// scanf("%s",message);
recv_rc=recv(client_fd,message,sizeof(message),0);
if(recv_rc==-1)
{
perror("recv call failedn");
exit(errno);
}
printf("Response from client:%sn",message);
if(strncmp(message,"stop",4)==0)
{
printf("stop the connectionn");
break;
}
}
close_rc=close(client_fd);
if(close_rc==-1)
{
perror("close call failed");
exit(errno);
}
exit (0);
}
我的程序:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int port=12345;
void *server();
int socket_descriptor;//socket描述符
int main()
{
pthread_t thread_id;
int sin_len;//字节数
char message[256];
struct sockaddr_in serv_addr;//保存socket信息
int connect_rc,close_rc;
ssize_t send_rc;
long save_file_flags;
// printf("Waiting for data from servern");
//初始化协议族,ip地址,端口号
bzero(&serv_addr,sizeof((serv_addr))); //清0
serv_addr.sin_family=AF_INET;//初始化协议族
serv_addr.sin_addr.s_addr=htons(INADDR_ANY);//初始化IP
serv_addr.sin_port=htons(port);//初始化端口
sin_len=sizeof(serv_addr);
//Create a TCP socket and bind it to the port
socket_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(socket_descriptor==-1)
{
perror("socket call failed");
exit(errno);
}
pthread_create(&thread_id,NULL,&server,NULL);//生成子线程
usleep(20);
connect_rc=connect(socket_descriptor,(struct sockaddr *)&serv_addr,sin_len);
if(connect_rc==-1)
{
perror("connect call failed");
exit(errno);
}
while(1)
{
// sleep(1);
scanf("%s",message);
send_rc=send(socket_descriptor,message,sizeof(message),0);
if(send_rc==-1)
{
perror("send call failed");
exit(errno);
}
// printf("Response from server:%sn",message);
if(strncmp(message,"stop",4)==0)
{
printf("Sender has told me to end the connectionn");
break;
}
}
close_rc=close(socket_descriptor);
if(close_rc==-1)
{
perror("close call failed");
exit(errno);
}
exit (0);
}
void* server()
{
int sin_len;
char message[256];
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
int client_fd;
int bind_rc,close_rc,listen_rc;
ssize_t recv_rc;
int BACKLOG=20;
pthread_t thread_id;
printf("Wait for data from clientn");
//初始化协议族,ip地址,端口号
bzero(&(my_addr),sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_addr.s_addr=htons(INADDR_ANY);
my_addr.sin_port=htons(port);
sin_len=sizeof(my_addr);
//Create a TCP socket and bind it to the port
#if 0
socket_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(socket_descriptor==-1)
{
perror("socket call failed");
exit(errno);
}
// pthread_create(thread_id,NULL,&client,NULL);
#endif
bind_rc=bind(socket_descriptor,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
if(bind_rc==-1)
{
perror("bind call failed");
exit(errno);
}
listen_rc=listen(socket_descriptor,BACKLOG);
if(listen_rc==-1)
{
perror("listen call failed");
exit(errno);
}
if((client_fd=accept(socket_descriptor,(struct sockaddr *)&remote_addr,&sin_len))==-1)
{
perror("accept call failed");
exit(errno);
}
// close(socket_descriptor);
//循环接受信息
while(1)
{
usleep(20);
// scanf("%s",message);
recv_rc=recv(client_fd,message,sizeof(message),0);
if(recv_rc==-1)
{
perror("recv call failedn");
exit(errno);
}
printf("Response from client:%sn",message);
if(strncmp(message,"stop",4)==0)
{
printf("stop the connectionn");
break;
}
}
close_rc=close(client_fd);
if(close_rc==-1)
{
perror("close call failed");
exit(errno);
}
exit (0);
}
|
LZ的问题就在于:服务器端和客户端使用了同一个SOCKET描述符,这种用法是错误的。
SOCKET编程,无论是用于IPC还是在不同主机之间建立网络连接,服务器与客户端使用的根本就是两个不同的SOCKET描述符。
之所以会出错那样的错误"Transport endpoint is already connected" ,是因为LZ的线程中先将套接口绑定到本机地址,用不太正式的解释来讲也就是已经将socket_descripter与本机地址进行了connect。然后在主线程中又试图使用将同样的套接口与同样的地址connect,所以就会出错。查看一下connect的错误返回码就知道,返回的是EALREADY。
LZ的程序也好改,只要将socket_descripter分别在主线程和新创建出来的线程中声明成局部变量就可以了。
SOCKET编程,无论是用于IPC还是在不同主机之间建立网络连接,服务器与客户端使用的根本就是两个不同的SOCKET描述符。
之所以会出错那样的错误"Transport endpoint is already connected" ,是因为LZ的线程中先将套接口绑定到本机地址,用不太正式的解释来讲也就是已经将socket_descripter与本机地址进行了connect。然后在主线程中又试图使用将同样的套接口与同样的地址connect,所以就会出错。查看一下connect的错误返回码就知道,返回的是EALREADY。
LZ的程序也好改,只要将socket_descripter分别在主线程和新创建出来的线程中声明成局部变量就可以了。
|
bzero(&serv_addr,sizeof((serv_addr))); //清0
serv_addr.sin_family=AF_INET;//初始化协议族
serv_addr.sin_addr.s_addr=htons(INADDR_ANY);//初始化IP
serv_addr.sin_family=AF_INET;//初始化协议族
serv_addr.sin_addr.s_addr=htons(INADDR_ANY);//初始化IP