【问题标题】:Socket Client Sends one long String rather than 3 StringsSocket 客户端发送一个长字符串而不是 3 个字符串
【发布时间】:2014-06-04 20:38:05
【问题描述】:

我正在用 C 编写一个小客户端,它将三个字符串发送到远处的服务器。例如我发送“FOO”、“BAR”、“FOOBAR”在另一边收到“FOOBARFOOBAR”、“null”、“null”。

这是我的客户代码:

#include<stdio.h> //printf
#include<string.h>    //strlen
#include<sys/socket.h>    //socket
#include<arpa/inet.h> //inet_addr

int main(int argc , char *argv[])
{
int sock;           
struct sockaddr_in server;
char message[1000];
 
//socket Erstellen
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1)
{
    printf("Socket konnte nicht Erstellt werden\n");
}
puts("Socket erstellt\n");
 
server.sin_addr.s_addr = inet_addr("194.94.82.231");    //Server Adressee
server.sin_family = AF_INET;                //Typ
server.sin_port = htons( 7896 );                //Port

//Zum Server Verbinden
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
{
    perror("Verbindung Fehlgeschlagen!\n");
    return 1;
}
 
puts("Verbunden\n");
 
  /*Eingaben die zum Server gesendet werden sollen*/
int n=0;

    printf("message : ");
    scanf("%s" , message);
 
    n = write(sock , message , strlen(message));
    if (n < 0)
        printf("ERROR writing to socket");

    printf("message 2: ");
    scanf("%s" , message);
 
    n = write(sock , message , strlen(message));
    if (n < 0)
        printf("ERROR writing to socket");

    printf("message 3: ");
    scanf("%s" , message);
 
    n = write(sock , message , strlen(message));
    if (n < 0)
        printf("ERROR writing to socket");

puts("\nFertig\n"); 
close(sock);
return 0;
}

【问题讨论】:

    标签: c linux sockets


    【解决方案1】:

    您的“错误”是您假设 TCP 套接字上的数据作为消息发送,具体取决于您在代码中执行 write() 的方式。 这适用于 UDP 数据报,但不适用于 TCP。

    TCP 套接字表现为数据的,因此您不能假设套接字一端的数据将如何到达另一端。

    协议保证的是所有数据都将以正确的顺序到达。根据网络状况(以及用于从套接字读取数据的缓冲区大小),您可能会一次接收所有数据,也可能会接收多个数据块。

    【讨论】:

    • 感谢您的回答 :) 我使用 TCP 协议,因为我需要确保我的数据到达服务器。那么,如果我发送一个字符串并在发送下一个字符串之前先等待响应,我可以“欺骗”套接字吗?
    • 这是一个选项。另一种可能是向套接字上发送的数据添加一些语义之王,例如识别消息,因为您使用一些特殊的字节或数据块来识别消息的开始和结束位置。根据您的上下文,一些第三方库 ike zmq 可以帮助您
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多