質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

3054閲覧

サーバーの並行型通信について質問です。

MOHUMOHU5

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

3クリップ

投稿2019/06/17 05:22

サーバーの並行型通信を行う課題が出たのですが、1部不明点があるので質問します。
コメント(//4)がついている部分のソースコードをどのように書けばよいかわからないので、よろしければ教えてほしいです。

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#include<unistd.h> 5#include<sys/socket.h> 6#include<netinet/in.h> 7#include<arpa/inet.h> 8#include<sys/types.h> 9#include<pthread.h> 10 11#define BUFSIZE 1024 12#define LISTENQ 1024 13 14void *thread(void *arg); 15 16struct ThreadArgs{ 17 int sock; 18 int cnt; 19 struct sockaddr_in sa; 20}; 21 22int main(int argc,char *argv[]) 23{ 24 int listen_sock,comm_sock,msg_len,sa_len,cnt,n; 25 struct sockaddr_in sa,new_sa; 26 pthread_t thread_id; 27 struct ThreadArgs *args; 28 char buf[BUFSIZE]; 29 30 listen_sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); 31 32 memset(&sa,0,sizeof(sa)); 33 sa.sin_family = AF_INET; 34 sa.sin_port = htons(49512); 35 sa.sin_addr.s_addr = htonl(INADDR_ANY); 36 37 if(bind(listen_sock,(struct sockaddr*)&sa,sizeof(sa))<0){ 38 fprintf(stderr,"bind()filure\n"); 39 exit(1); 40 } 41 42 if(listen(listen_sock,LISTENQ)<0){ 43 fprintf(stderr,"listen() failure\n"); 44 exit(1); 45 } 46 47 cnt = 0; 48 while(1){ 49 printf("Waiting for a client\n"); 50 sa_len = sizeof(new_sa); 51 if((comm_sock = accept(listen_sock,(struct sockaddr *)&new_sa,&sa_len))<0){ 52 fprintf(stderr,"accept() faiure\n"); 53 exit(1); 54 } 55 56 ++cnt; 57 58 //1 59 args = (struct ThreadArgs *)malloc(sizeof(struct ThreadArgs)); 60 //2 61 args->sock = listen_sock; 62 args->cnt = cnt; 63 args->sa = sa; 64 65 //3 66 if (pthread_create(&thread_id,NULL,(void *)thread,(void *)comm_sock)!=0){ 67 fprintf(stderr,"pthread_create() failure\n"); 68 exit(1); 69} 70 return 0; 71 } 72 73 void *thread(void *arg) 74 { 75 int sock,cnt ,n msg_len; 76 struct sockaddr_in sa; 77 char buf[BUFSIZE]; 78 79 pthread_detach(pthread_self()); 80 81 82 83 //4,argから通信用ソケットディスクリプタ、クライアント番号、アドレス 84  //構造体を取得し、それぞれsock,cnt,saにセット 85 86 87 printf("Client %d(%s)connected\n",cnt,inet_ntoa(sa.sin_addr)); 88 89 if((n = recv(comm_sock,buf,sizeof(buf),0))>0){ 90 buf[n] = '\0'; 91 msg_len = strlen(buf); 92 printf("Client %d:%s\n",cnt,buf); 93 if(send(sock,buf,msg_len,0)!= msg_len){ 94 fprintf(stderr,"send()failure\n"); 95 free(arg); 96 return; 97 98 99 }} 100 close(sock); 101 printf("Client %d disconnected\n",cnt); 102 103 free(arg); 104 105 return; 106 } 107 108

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/06/17 07:41

キャストについて調べてみてはいかがでしょうか。 ただ、折角授業料を支払っているのであれば、そこでお聞きするのが一番かと思いますよ。また、ソースはインデントをきちんとわかるようにした方が良いです。
guest

回答1

0

C

1void *thread(void *arg) { 2 struct ThreadArgs* thr_args = (struct ThreadArgs*)arg; 3 4 int sock = thr_args->sock; 5 /* などなど... */ 6}

投稿2019/06/17 10:57

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問