1

我想知道为什么在使用带有套接字的线程时我无法发送数据。

我想知道为什么当我使用第一种方法(无线程)发送时,它可以工作,但使用第二种方法,它无法发送数据。

这是我的声明:

int main(int argc, char *argv[]) 
{
    int sd, rc, i;
    struct sockaddr_in cliAddr, remoteServAddr;
    struct hostent *h;
    h = gethostbyname(argv[1]);
    inet_ntoa(*(struct in_addr *)h->h_addr_list[0]));

    remoteServAddr.sin_family = h->h_addrtype;
    memcpy((char *) &remoteServAddr.sin_addr.s_addr,h->h_addr_list[0], h->h_length);
    remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT);

    /* socket creation */
    sd = socket(AF_INET,SOCK_DGRAM,0);

    /* bind any port */
    cliAddr.sin_family = AF_INET;
    cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    cliAddr.sin_port = htons(0);

    rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr));

    socklen_t remoteServLen = sizeof(remoteServAddr);
    //this is my own class to store the pointers to the following variables
    clientInfo ci(&sd,&rc,&remoteServLen,&remoteServAddr,&cliAddr);

/第一种方法/

    char *data;
    char input[MAX_MSG];

    std::cout << "Enter message to send (type /q to quit) : ";  
    std::cin >> input;
    data = input;

    rc = sendto(*(ci.getSd()), data, strlen(data)+1, 0,(struct sockaddr *) ci.getCliAddr(),*(ci.getCliLen()));

/第一种方法/

/第二种方法/

    pthread_t thread[2];
    int status;

    status = pthread_create (&thread[1], NULL, sendFunction,&ci);

/第二种方法/

}

/这是我的线程方法/

void* sendFunction (void* temp)
{

    int status;
    char *data;
    char input[MAX_MSG];
    int rc;

    clientInfo *ci;
    ci = (clientInfo*)temp;

    status = pthread_detach (pthread_self ());

    while(1)
    {
        std::cout << "Enter message to send (type /q to quit) : ";  
        std::cin >> input;
        data = input;


        rc = sendto(*(ci->getSd()), data, strlen(data)+1, 0,(struct sockaddr *) ci->getCliAddr(),*(ci->getCliLen()));

        if(rc<0) 
        {
            printf("Cannot send data %s \n",data);
        }
    }//end of while loop

    return NULL;
}//end of sendFunction method

:) 提前致谢!:D

4

1 回答 1

4

如果您提供了目标平台/环境,那就太好了。我假设你使用的是 Linux,所以我最好的猜测是你的线程实际上在它有机会发送任何东西之前就终止了。您可能想知道为什么会这样,因为您已将其分离。好吧,对于那些阅读过一些关于 POSIX 线程的抽象文章/书籍的人来说,这是一个非常常见的错误。事实是 - 它不是那样工作的。这在 Linux 的手册页中有明确说明pthread_detach()

The detached attribute merely determines the behavior of the system when the
thread terminates; it does not prevent the thread from being terminated if the
process terminates using exit(3) (or equivalently, if the main thread
returns).

我建议您实际上join()从主线程“发送”线程,看看它是否可以工作。如果没有 - 回来更新。此外,使用调试器永远不会有什么坏处——它很可能会立即显示出问题所在。

附带说明一下,线程不是C10K 问题的解决方案。例如,创建两个线程只是为了有两个(阻塞)发送者根本不是可行的方法。为此,操作系统提供异步通知机制。例如,Linux 得到了epoll,FreeBSD(和 OS X :-))是建立在kqueue之上的。还有轮询、选择、端口完成等。还有一些 API 封装了这些机制(出于可移植性和/或简化的原因)。libeventBoost.Asio是最受欢迎的选择。

希望能帮助到你。

于 2012-07-26T02:52:05.547 回答