在同一台机器上运行的C应用程序之间的套接字通

时间:2014-08-19 14:14:23

标签: c sockets

我使用C语言和Linux作为开发两个小应用程序的平台。第一个是客户端,通过套接字发送一个字符,第二个是服务器,它读取消息并发回与读取的内容相同的内容。

一旦应用程序之间建立了连接,则以下代码应该发送和接收相同的消息5次:

代码编辑:

char buf[100];
char message[100];
fd_set readfds, writefds;
int n, rvd;

memset(message, 0, sizeof(message));
message[0] = 'a';

inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof s);
printf("client: connecting to,, %s\n", s);

freeaddrinfo(servinfo);

n = sockfd+1;

for (unsigned long i=0; i<5; i++)
{

    FD_ZERO(&readfds);
    FD_ZERO(&writefds);

    FD_SET(sockfd, &readfds);
    FD_SET(sockfd, &writefds);

    rvd = select(n, NULL, &writefds, NULL, NULL);

    if (rvd > 0)
    {
        printf("client: writing '%s'\n",message);
        if ((numSent = send(sockfd, message, strlen(message), 0)) != -1)
        {

            rvd = select(n, &readfds, NULL, NULL, NULL);
            if (rvd > 0)
            {
                if ((numbytes = recv(sockfd, buf, numSent, 0)) != -1)
                {
                    printf("client: received '%s'\n",buf);
                }
                //timestamp it
                //count successful package sent
            }
            else
            {
                //throw this measurement
            }
        }
    }
}

程序成功发送和接收消息两次。当它尝试发送三分之一时它失败,即使函数select返回一个大于0的值(这意味着服务器已准备好接收数据)。

使用eclipse进行调试时,函数send()在第三次执行时崩溃,并显示以下消息:

“0x7ffff7bcc282”发送()无可用来源

查看反汇编... [按钮]

当我在虚拟机上运行服务器应用程序时,一切都运行正常。

有什么想法?提前谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

  1. 每次致电readfds时,您都没有重置writefdsselect(),因为每次都会修改它们。

  2. 您滥用sizeof()

  3. 尝试更像这样的东西:

    char message[1024];
    char buf[1024];
    fd_set readfds, writefds;
    int numSent, numRead;
    
    memset(message, 0, sizeof(message));
    strncpy(message, "whatever you need to send...", sizeof(message)-1);
    
    for (unsigned long i = 0; i < 5; ++i)
    {
        FD_ZERO(&writefds);
        FD_SET(sockfd, &writefds);
    
        FD_ZERO(&readfds);
        FD_SET(sockfd, &readfds);
    
        rvd = select(sockfd+1, NULL, &writefds, NULL, NULL); 
        if (rvd == -1)
            break;
    
        printf("client: writing '%s'\n", message);
        if ((numSent = send(sockfd, message, strlen(message), 0)) < 1)
            break;
    
        rvd = select(sockfd+1, &readfds, NULL, NULL, NULL);
        if (rvd == -1)
            break;
    
        if ((numRead = recv(sockfd, buf, numSent, 0)) < 1)
            break;
    
        printf("client: received '%*s'\n", numRead, buf);
    }