当前位置:  技术问答>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);
}

|
LZ的问题就在于:服务器端和客户端使用了同一个SOCKET描述符,这种用法是错误的。
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 

    
 
 

您可能感兴趣的文章:

  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于socket概念的理解问题!
  • socket编程 中的bind问题
  • 你是否可以回答Socket的问题?数据先后问题
  • 多进程socket编程问题
  • Socket的问题
  • socket accept问题,大家指教。
  • socket客户端程序的问题
  • 关于多网口socket通信的简单问题
  • WEB前端 iis7站长之家
  • linux socket fd 写阻塞问题
  • linux下用socket实现多进程间通信问题?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • sco unix下socket编程的问题,请大家帮忙
  • 请问socket方面的问题
  • socket编程中的问题,请各位大侠指教!
  • 急!!请教关于linux socket编程的一个问题!!
  • socket编程,使用recvfrom()函数监听问题。
  • linux下socket编程问题!
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3