ここから本文です

LinuxのTCPに関する質問です。 環境:Ubuntu18.04 下記のserver.cとclient.c...

nqf********さん

2019/12/909:28:21

LinuxのTCPに関する質問です。

環境:Ubuntu18.04

下記のserver.cとclient.cはそれぞれサーバーとクライアントプログラムと思います。

Q1)このコードのラン方法についてお教え頂けないでしょうか?

//file name: WK_tcp/server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h> //exit(1)
#include <string.h> //memset
#include <unistd.h> //read, write
#define TRUE 1

/*
* This program creates a socket and then begins an infinite loop.
* Each time through the loop it accepts a connection and prints
* data from it. When the connection breaks, or the client closes
* the connection, the program accepts a new connection.
*/

int main(){
int sock, length;
struct sockaddr_in server;
int msgsock;
char buf[1024];
int rval;

/* Create socket. */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("opening stream socket");
exit(1);
}
/* Bind socket using wildcards.*/
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = 0;
if (bind(sock, (struct sockaddr *) &server, sizeof server)
== -1) {
perror("binding stream socket");
exit(1);
}
printf(" Find out assigned port number and print it out. \n");
/* Find out assigned port number and print it out. */
length = sizeof server;
if (getsockname(sock,(struct sockaddr *) &server,&length)
== -1) {
perror("getting socket name");
exit(1);
}
printf("Socket port #%d\n", ntohs(server.sin_port));
/* Start accepting connections. */
listen(sock, 5);
printf(" listen(sock, 5): end \n");

do {
msgsock = accept(sock,(struct sockaddr *) 0,(int *) 0);
if (msgsock == -1) perror("accept");
else do {
memset(buf, 0, sizeof buf);
if ((rval = read(msgsock,buf, 1024)) == -1) perror("reading stream message");
if (rval == 0)
printf("Ending connection\n");
else
/* assumes the data is printable */
printf("-->%s\n", buf);
} while (rval > 0);
close(msgsock);
} while(TRUE);
/*
* Since this program has an infinite loop, the socket "sock" is
* never explicitly closed. However, all sockets will be closed
* automatically when a process is killed or terminates normally.
*/
exit(0);
}

===============================
//file name: WK_tcp/client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h> //exit(1)
#include <string.h> //memset
#include <unistd.h> //read, write

#define DATA "Half a league, half a league . . ."

/*
* The form of the command line is: streamwrite hostname portnumber
* Usage: pgm host port
*/
int main(argc, argv)
int argc;
char *argv[];
{
int sock;
struct sockaddr_in server;
struct hostent *hp, *gethostbyname();
char buf[1024];

/* Create socket. */
sock = socket( AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("opening stream socket");
exit(1);
}
/* Connect socket using name specified by command line. */
server.sin_family = AF_INET;
hp = gethostbyname(argv[1] );
/*
* gethostbyname returns a structure including the network address
* of the specified host.
*/
if (hp == (struct hostent *) 0) {
fprintf(stderr, "%s: unknown host\n", argv[1]);
exit(2);
}
printf("if (hp == (struct hostent *) 0)\n");
memcpy((char *) &server.sin_addr, (char *) hp->h_addr,
hp->h_length);
server.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr *) &server, sizeof server)
== -1) {
perror("connecting stream socket");
exit(1);
}
if (write( sock, DATA, sizeof DATA) == -1)
perror("writing on stream socket");
close(sock);
exit(0);
}
====================================
以上、宜しくお願いします。

閲覧数:
30
回答数:
1
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

noo********さん

2019/12/1213:25:00

WK_tcp/server.cの実行モジュール名をserver、WK_tcp/client.cの
実行モジュール名をclientとします。


コンパイルした実行モジュールがあるディレクトリに移動して、
./server &

(サーバプログラムがLISTENするポート番号が表示される)

./client localhost 表示されたポート番号

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/12/15 21:03:53

毎度お世話になります。
明快な回答ありがとう御座いました。
多少変更とかして、テストしてみます。
ありがとう御座いました。
感謝!!!!!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる