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

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

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

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

Q&A

1回答

855閲覧

TCPIPのC言語コードがコンパイルできない

StormRider0602

総合スコア2

C

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

0グッド

0クリップ

投稿2023/04/13 07:17

実現したいこと

C言語入門者が練習でTCP/IP通信のプログラムを作っています。一台のパソコンでサーバーとクライアントを担う予定です。

前提

VisualStudioCodeを使っています。
macOSで動くコードを参考に、windows環境でincludeを変更したのち、コンパイルができません。

gccを使ってコンパイルを試みると以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

C:\Users\AppData\Local\Temp\ccqSP3Qe.o:tcpip_client.c:(.text+0x69): undefined reference to `__imp_send' C:\Users\AppData\Local\Temp\ccqSP3Qe.o:tcpip_client.c:(.text+0xaa): undefined reference to `__imp_recv' C:\Users\AppData\Local\Temp\ccqSP3Qe.o:tcpip_client.c:(.text+0x12a): undefined reference to `__imp_socket' C:\Users\AppData\Local\Temp\ccqSP3Qe.o:tcpip_client.c:(.text+0x174): undefined reference to `__imp_htons' C:\Users\AppData\Local\Temp\ccqSP3Qe.o:tcpip_client.c:(.text+0x188): undefined reference to `__imp_inet_addr' C:\Users\AppData\Local\Temp\ccqSP3Qe.o:tcpip_client.c:(.text+0x1b2): undefined reference to `__imp_connect' collect2.exe: error: ld returned 1 exit status

該当のソースコード

C

1#include <winsock2.h> 2#include<ws2tcpip.h> 3#include <stdio.h> 4#include <string.h> 5#include <unistd.h> 6#define SERVER_ADDR "127.0.0.1" 7#define SERVER_PORT 8080 8#define BUF_SIZE 1024 9//関数のプロトタイプ宣言 10int transfer(int); 11//関数 12int transfer(int sock) { 13 char send_buf[BUF_SIZE], recv_buf; 14 int send_size, recv_size; 15 while (1) { 16 /* サーバーに送る文字列を取得 */ 17 printf("Input Message...\n"); 18 scanf("%s", send_buf); 19 send_buf[8] = '\n'; 20 send_buf[9] = 0; 21 /* 文字列を送信 */ 22 send_size = send(sock, send_buf, strlen(send_buf) + 1, 0); 23 if (send_size == -1) { 24 printf("send error\n"); 25 break; 26 } 27 /* サーバーからの応答を受信 */ 28 recv_size = recv(sock, &recv_buf, 1, 0); 29 if (recv_size == -1) { 30 printf("recv error\n"); 31 break; 32 } 33 if (recv_size == 0) { 34 /* 受信サイズが0の場合は相手が接続閉じていると判断 */ 35 printf("connection ended\n"); 36 break; 37 } 38 /* 応答が0の場合はデータ送信終了 */ 39 if (recv_buf == 0) { 40 printf("Finish connection\n"); 41 break; 42 } 43 } 44 return 0; 45} 46//メイン文 47int main(void) { 48 int sock; 49 struct sockaddr_in addr; 50 /* ソケットを作成 */ 51 sock = socket(AF_INET, SOCK_STREAM, 0); 52 if (sock == -1) { 53 printf("socket error\n"); 54 return -1; 55 } 56 /* 構造体を全て0にセット */ 57 memset(&addr, 0, sizeof(struct sockaddr_in)); 58 /* サーバーのIPアドレスとポートの情報を設定 */ 59 addr.sin_family = AF_INET; 60 addr.sin_port = htons((unsigned short)SERVER_PORT); 61 addr.sin_addr.s_addr = inet_addr(SERVER_ADDR); 62 /* サーバーに接続要求送信 */ 63 printf("Start connect...\n"); 64 if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1) { 65 printf("connect error\n"); 66 close(sock); 67 return -1; 68 } 69 printf("Finish connect!\n"); 70 /* 接続済のソケットでデータのやり取り */ 71 transfer(sock); 72 /* ソケット通信をクローズ */ 73 close(sock); 74 return 0; 75}

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

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

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

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

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

can110

2023/04/13 07:37 編集

- gcc構築環境(Cygwin?MinGW?など) - 「gcc -lwsock32~」といった実行コマンド も記載したほうがよいと思います。
guest

回答1

0

それは (コンパイル ではなく) リンク に失敗しています。
ライブラリ Ws2_32.lib をリンクしていますか?

投稿2023/04/13 07:22

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問