実現したいこと
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}
- gcc構築環境(Cygwin?MinGW?など)
- 「gcc -lwsock32~」といった実行コマンド
も記載したほうがよいと思います。