• ベストアンサー

[Win + Eclipse + GCC]socketクライアントの作成方法

Windows XP に GCC と Eclipseをインストールしました。 過去にVisual Studio 2008 Express Editionを使用していたとき ソケットクライアントは以下のとおり実装しました。 ーーーー #include <iostream> #include <ws2tcpip.h> #pragma comment(lib,"ws2_32.lib") using namespace std; int main() { int dstSocket; struct sockaddr_in dstAddr; WSADATA data; WSAStartup(MAKEWORD(2,0), &data); // sockaddr_in 構造体のセット memset(&dstAddr, 0, sizeof(dstAddr)); dstAddr.sin_port = htons(80); dstAddr.sin_family = AF_INET; dstAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // ソケットの生成 dstSocket = socket(AF_INET, SOCK_STREAM, 0); //接続 if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){ cout << "接続できませんでした\n" << endl; return(-1); } char buffer[1024] = "GET / HTTP/1.0\r\n\r\n"; send(dstSocket, buffer, sizeof(buffer), 0); //パケットの受信 int n = recv(dstSocket, buffer, sizeof(buffer), 0); cout << buffer << endl; // Windows でのソケットの終了 closesocket(dstSocket); WSACleanup(); return(0); } ーーーー 上記と同じ機能をGCC上で実装したいのですが、どこかに コードのサンプルがのっているWebサイトはありますか?

noname#97178
noname#97178

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

-mno-cygwin は?

noname#97178
質問者

お礼

cygwin上で-mno-cygwinを使用したところエラーになりました。cygwin上でcygwinのライブラリを使わないというオプションは使用できないようです。コマンドプロンプト上で-mno-cygwinを付加したところ無事コンパイルできました。ありがとうございました。ただしeclipse上で-mno-cygwinを使う方法がわかりません。makeファイルを直接編集して対応できましたがeclipse上から-mno-cygwinを使う方法は別途探してみます。

その他の回答 (2)

回答No.2

お疲れ様です。 gccが手元にないので実証出来ていませんが、 #include <ws2tcpip.h> を extern "C"{ #include <ws2.tcpip.h> } とするとどうなりますか? また、pragma自体はgccでもサポートされているようですが、commentはgccでサポートされていないようです。 コンパイルオプション等でリンクするしかないようです。(他の方法があるのか不明) それと、同じような質問をされるのであれば、前回と同じようにどのようなエラーが出ているのか記載をしないと読む気がしなくなりますよ。

noname#97178
質問者

お礼

ご回答頂き感謝しております。しかし上記の対応では不可でございました。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

optionつけてコンパイルしたらそのままできませんか g++ yourprogram.cpp -lws2_32 -mno-cygwin

noname#97178
質問者

お礼

駄目でした。故障でしょうか。 C:\>g++-4 test.cpp -lws2_32 In file included from /usr/lib/gcc/i686-pc-cygwin/4.3.2/../../../../include/w32a pi/ws2tcpip.h:19, from test.cpp:2: /usr/lib/gcc/i686-pc-cygwin/4.3.2/../../../../include/w32api/winsock2.h:103:2: w arning: #warning "fd_set and associated macros have been defined in sys/types. This may cause runtime problems with W32 sockets" In file included from /usr/lib/gcc/i686-pc-cygwin/4.3.2/../../../../include/w32a pi/ws2tcpip.h:19, from test.cpp:2: /usr/lib/gcc/i686-pc-cygwin/4.3.2/../../../../include/w32api/winsock2.h:635: err or: declaration of C function 'int gethostname(char*, int)' conflicts with /usr/include/sys/unistd.h:206: error: previous declaration 'int gethostname(char *, size_t)' here

関連するQ&A

  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

  • UDP通信について

    UDP通信で困っています。 TCP/IP通信はすぐにうまくいったのですが、 UDPの簡単なサンプルがちゃんと動きません。 間違いがあればご指摘ください。 よろしくお願いします。 (クライアント側ソース int sock; struct sockaddr_in din; memset(&din, 0, sizeof(din)); din.sin_port = htons(50050); din.sin_family = AF_INET; din.sin_addr.s_addr = inet_addr("サーバーIP"); sock = socket(AF_INET, SOCK_DGRAM, 0); int buf = 12345; sendto(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&din,sizeof(struct sockaddr_in)); (サーバー側ソース int sock; struct sockaddr_in sin; sock = socket(AF_INET, SOCK_DGRAM, 0); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(50050); sin.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) { return(1); } struct sockaddr_in fromaddr; socklen_t len = sizeof(struct sockaddr_in); int buf; recvfrom(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&fromaddr,&len); printf("recv:%d\n",buf);

  • C言語開発環境について

    このプログラムを実行出来るコンパイラ?あるいは開発環境を紹介して頂けませんか?出来れば無償版がいいです。よろしくお願い致します。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3"); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • C言語エラーの解決法教えてください。

    以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか? 1 IntelliSense: 識別子 "WSAData" が定義されていません 2 IntelliSense: 識別子 "wsaData" が定義されていません #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData; wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(9750); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.8 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } 教えてください。宜しくお願いします。

  • windows版C++ソケットプログラムエラー

    windows版のC++のソケット通信プログラムです。 server、clientそれぞれのプログラムにおいてエラーがでます。 修正をお願いします。 server側 ・エラー内容 'status' : 定義されていない識別子です。 ・プログラム status = closesocket(dstSocket); break; ・全体プログラム #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #define BUFFER_SIZE 256 int main() { /* ポート番号、ソケット */ unsigned short port = 9876; int srcSocket; // 自分 int dstSocket; // 相手 /* sockaddr_in 構造体 */ struct sockaddr_in srcAddr; struct sockaddr_in dstAddr; int dstAddrSize = sizeof(dstAddr); /* 各種パラメータ */ int numrcv; char buffer[BUFFER_SIZE]; /************************************************************/ /* Windows 独自の設定 */ WSADATA data; WSAStartup(MAKEWORD(2,0), &data); /* sockaddr_in 構造体のセット */ memset(&srcAddr, 0, sizeof(srcAddr)); srcAddr.sin_port = htons(port); srcAddr.sin_family = AF_INET; srcAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* ソケットの生成 */ srcSocket = socket(AF_INET, SOCK_STREAM, 0); /* ソケットのバインド */ bind(srcSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr)); /* 接続の許可 */ listen(srcSocket, 1); /* 接続の受付け */ printf("Waiting for connection ...\n"); dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize); printf("Connected from %s\n", inet_ntoa(dstAddr.sin_addr)); /* パケット受信 */ while(1) { numrcv = recv(dstSocket, buffer, BUFFER_SIZE, 0); if(numrcv == 0 || numrcv == -1) { status = closesocket(dstSocket); break;                 ←ここです!!! } printf("received: %s\n", buffer); } /* Windows 独自の設定 */ WSACleanup(); } client側 ・エラー内容 1 'stAddr' : 定義されていない識別子です。 2 '.sin_addr' の左側はクラス、構造体、共用体でなければなりません 3 '.S_un' の左側はクラス、構造体、共用体でなければなりません 4 '.S_addr' の左側はクラス、構造体、共用体でなければなりません 5 'i' : 定義されていない識別子です。 6 'i' : 定義されていない識別子です。 7 'i' : 定義されていない識別子です。 ・プログラム 1~4 stAddr.sin_addr.s_addr = inet_addr(destination); 5~7 for(i=0; i<10; i++) ・全体プログラム #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> int main() { /* IP アドレス、ポート番号、ソケット */ char destination[80]; unsigned short port = 9876; int dstSocket; /* sockaddr_in 構造体 */ struct sockaddr_in dstAddr; /* 各種パラメータ */ int status; int numsnt; char *toSendText = "This is a test"; /************************************************************/ /* Windows 独自の設定 */ WSADATA data; WSAStartup(MAKEWORD(2,0), &data); /* 相手先アドレスの入力 */ printf("Connect to ? : (name or IP address) "); scanf("%s", destination); /* sockaddr_in 構造体のセット */ memset(&dstAddr, 0, sizeof(dstAddr)); dstAddr.sin_port = htons(port); dstAddr.sin_family = AF_INET; stAddr.sin_addr.s_addr = inet_addr(destination);                 ←ここです!!! /* ソケット生成 */ dstSocket = socket(AF_INET, SOCK_STREAM, 0); /* 接続 */ printf("Trying to connect to %s: \n", destination); connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr)); /* パケット送出 */ for(i=0; i<10; i++) { ←ここです!!! printf("sending...\n"); send(dstSocket, toSendText, strlen(toSendText)+1, 0); Sleep(1000); } /* Windows 独自の設定 */ closesocket(dstSocket); WSACleanup(); } です。 読みづらいとは思いますがよろしくお願いします(><)

  • 実行ファイルのweb掲載可否

    以下のプログラムの実行ファイルをweb上に載せることはできるのでしょうか? #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • UDPデータ受信について

    以下でデータを送信すると、直ぐに0x42,0x42,0x00,0x00,0x00,0x00,0x82,0x00,0x01,0x44,0x33,0x00の12バイトのデータを送り返してくるのですが、これを送り返してきたら、数字の1を表示するように以下のプログラム内に書き込むことは出来ませんでしょうか?ご教授お願いします。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • UDPでのブロードキャスト送信

    Linuxで下記UDPブロードキャスト送信プログラムを作ったのですが、sendto()関数の戻り値が-1となり エラーとなってしまうので送信できません。 何が悪いのでしょうか? ちなみにIPアドレスは192.168.0.1 サブネットマスクは255.255.0..0でやっています。 又、サブネットマスクを0.0.0.0で試してもみましたがダメでした。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> int main() { int sock; struct sockaddr_in addr; int yes = 1; sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = inet_addr("255.255.255.255"); setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&yes, sizeof(yes)); if(sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr))!=5) printf("send error!!\n"); close(sock); return 0; }

  • winsockを使った通信方法

    送信側 #include <winsock2.h> #include <string.h> int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; typedef struct recv { char Name[32]; int Flag; } RECV; RECV send; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); strcat(send.Name, "ABC"); send.Flag=12; len=sizeof(send); sendto(sock,(char *)&send,len, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); system("pause"); return 0; } 受信側 #include <stdio.h> #include <winsock2.h> #include <string.h> int main() { typedef struct rcv { char Name[32]; int Flag; } RECV; WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; RECV rcv; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); len=sizeof(rcv); recv(sock,(char *)&rcv, len, 0); printf("%s [%d]\n",rcv.Name,rcv.Flag); closesocket(sock); WSACleanup(); system("pause"); return 0; } winsockを使ったUDP通信プログラムで構造体データを送る事が出来ないのですが どこに誤りがあるのでしょうか? コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。

  • LinuxでのC言語通信プログラムについて

    サーバーとクライアントで足し算を行うプログラムを実行するとサーバーからの計算結果が返ってきません。ソースコードは以下に示します。 クライアントのプログラム #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { int sockfd ; int tolen , fromlen ; struct sockaddr_in to_address , from_address ; int result ; int ch[3] ; sockfd = socket(AF_INET,SOCK_DGRAM,0); to_address.sin_family = AF_INET ; to_address.sin_addr.s_addr = INADDR_ANY ; to_address.sin_port = htons(9734) ; tolen = sizeof(to_address); bind(sockfd , (struct sockaddr *)&to_address , tolen); printf("A = "); scanf("%d",&ch[0]); printf("B = "); scanf("%d",&ch[1]); sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&to_address , tolen); recvfrom(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &fromlen); printf("A + B = %d \n",ch[2]); close(sockfd); exit(0); } サーバーのプログラム #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { int ch[3] ; int sockfd ; int tolen , fromlen ; struct sockaddr_in to_address ; struct sockaddr_in from_address ; sockfd = socket(AF_INET,SOCK_DGRAM,0); to_address.sin_family = AF_INET ; to_address.sin_addr.s_addr = INADDR_ANY ; to_address.sin_port = htons(9734) ; tolen = sizeof(to_address); bind(sockfd , (struct sockaddr *)&to_address , tolen); while(1) { printf("server waiting\n"); recvfrom(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &fromlen); ch[2] = ch[0] + ch[1] ; sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , fromlen); } }