1

私はこのプログラムを書きました:

#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int socket_desc;
struct sockaddr_in adress;
int addrlen;
int new_socket;
int bufsize = 1024;

char *you_sent = "You sent: ";

int main() {
    char *buffer = malloc(bufsize);
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    adress.sin_family = AF_INET;
    adress.sin_addr.s_addr = INADDR_ANY;
    adress.sin_port = htons(7000);
    bind(socket_desc, (struct sockaddr *)&adress, sizeof(adress));
    listen(socket_desc, 3);
    addrlen = sizeof(struct sockaddr_in);
    new_socket = accept(socket_desc, (struct sockaddr *)&adress, &addrlen);
    while(recv(new_socket,buffer,bufsize,0))
    {
        printf("I recieved: %s", buffer);
        send(new_socket, you_sent, strlen(you_sent), 0);
        send(new_socket, buffer, strlen(buffer), 0);
        memset(buffer, '\0', sizeof(buffer));
    }
}

telnetでサーバーに接続できます。そして、アプリケーションにデータを書き込み、アプリケーションからデータを受け取ります。しかし、別のcプログラムでこれに接続し、そのプログラムからデータを送受信する方法について頭を悩ませることはできません。私はこれを試しました:

#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int socket_desc;
struct sockaddr_in adress;
int addrlen;
int new_socket;

char *message_to_send = "Hello world!";

int main() {
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    adress.sin_family = AF_INET;
    adress.sin_addr.s_addr = INADDR_ANY;
    adress.sin_port = htons(7000);
    bind(socket_desc, (struct sockaddr *)&adress, sizeof(adress));
    listen(socket_desc, 3);
    addrlen = sizeof(struct sockaddr_in);
    new_socket = accept(socket_desc, (struct sockaddr *)&adress, &addrlen);
    send(new_socket, message_to_send, strlen(message_to_send), 0);
}
4

2 に答える 2

5

サーバーは、交換手にある電話交換手のようなものです。その人は次のことをします:

  • 電話の前に座っている(つまりbind、番号に)
  • 鳴るのを待ちます(つまりlisten
  • 電話を取る(すなわちaccept

相手の人は、その人に電話をかけたいだけです。(すなわちconnect)。電話をかける必要があるときだけ、その人は電話に行く必要があります。したがって、電話に縛られたり、電話が鳴るのを聞く必要はありません。

この比喩があなたの理解に役立つことを願っています。

PS:そのsocket部分は壁の電話ソケットです。

于 2012-12-04T21:25:15.920 に答える
4

シーケンスは次のとおりです。

サーバ側:

  • socketsyscallを使用したソケットの作成。
  • ポートとbindsyscallのバインド。
  • システムコールでリッスンしlistenます(これにより、バックログキューが有効になります)。
  • acceptシステムコール で着信接続を受け入れる
    • これはブロック操作です。接続が確立されるまでスレッドはブロックされたままになります)。
    • このaccept関数は、新しい接続を表す新しいファイル記述子を返します。これを使用して他のホストとデータを送受信し、元のファイル記述子(からsocket)を新しい着信接続に使用します。

クライアント側:

  • socket;によるソケットの作成
  • との接続connect

ここにいくつかの追加のリソースがあります。

于 2012-12-04T21:19:57.370 に答える