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

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

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

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

C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

解決済

1回答

4720閲覧

C言語Winsock2 TCPで外部通信ができません

yukkyooooo

総合スコア12

C

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

C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

1クリップ

投稿2015/08/06 17:12

サーバ用 server.c
#include <stdio.h>
#include <winsock2.h>

#define debug

//関数宣言 プロトタイプ宣言
void sessionTCP(int sv_port);

void main(void){

int sv_port = 34000; sessionTCP(sv_port);

}

//接続用 TCP
void sessionTCP(int sv_port){

int err_ws; SOCKET sock_s; SOCKET sock_c; struct sockaddr_in addr; struct sockaddr_in client; BOOL yes = 1; WSADATA ws; err_ws=WSAStartup(MAKEWORD(2,0),&ws); if(err_ws != 0){ exit(1); } sock_s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (sock_s == INVALID_SOCKET){ printf("socket : %d\n", WSAGetLastError()); } addr.sin_family = AF_INET; addr.sin_port = htons(sv_port); //addr.sin_addr.S_un.S_addr = INADDR_BROADCAST; addr.sin_addr.S_un.S_addr = INADDR_ANY; setsockopt(sock_s,SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes)); #ifdef debug printf("bind start...\n"); #endif if(bind(sock_s,(struct sockaddr *)&addr,sizeof(addr))!=0){ printf("bind error\n"); } #ifdef debug printf("listen start...\n"); #endif listen(sock_s, 5); int sock_s_len=sizeof(client); char revcmd[100]; while(1){ #ifdef debug printf("accept start..."); #endif sock_c = accept(sock_s, (struct sockaddr *)&client,&sock_s_len); printf("IP:%s PORT:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port)); scanf("%s",revcmd); send(sock_c,revcmd,sizeof(revcmd), 0); closesocket(sock_c); } WSACleanup();

}

クライアント用 client.c
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>

#define debug

void sessionTCPstart(char *IPAddress,int port);

int main(){
char ip[]="xxx.xxx.xxx.xxx";
int port=34000;

sessionTCPstart(ip,port);

return 0;
}
void sessionTCPstart(char *IPAddress,int port){

char ip[16]; strcpy(ip,IPAddress); WSADATA wsaData; struct sockaddr_in server; SOCKET sock; char cmd[256]; WSAStartup(MAKEWORD(2,0), &wsaData);

while(1){
#ifdef debug
printf("connect start...\n");
#endif

sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET){ printf("ソケットエラー\n"); } server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr.S_un.S_addr = inet_addr(ip); if(connect(sock, (struct sockaddr *)&server, sizeof(server))){ printf("connect error\n"); } memset(cmd, 0, sizeof(cmd)); int n = recv(sock, cmd, sizeof(cmd), 0); printf("%s",cmd); if(strcmp(cmd,"-exit")==0){ exit(1); } closesocket(sock);

}
WSACleanup();

}

コンパイラはGCCを使用しております。
「gcc -lwsock32 server.c -lws2_32 -o server -m32」
「gcc -lwsock32 client.c -lws2_32 -o client -m32」
でコンパイルしています。

ローカルIPでは問題なく通信できました。
グローバルIPでやろうとするとまったく通信ができないです。
CONNECTに失敗します。ルータでポート転送設定はしており、サーバ設置PC
ではESETのセキュリティソフトを使用しておりますがそちらもポートを空けて
おります。それでも通信ができません。

どうすれば通信できますか。
お力をお貸しください。

NOTEPAD+で開発しております。

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

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

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

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

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

kiri

2015/08/06 19:19

WSAGetLastErrorを使ってconnectのエラーコードを確認していただけますでしょうか? printf("connect error: %d\n", WSAGetLastError());
coco_bauer

2015/08/07 09:43

質問です > ローカルIPでは問題なく通信できました。 > グローバルIPでやろうとするとまったく通信ができないです。 と書かれているのですが、これは 「 サーバとクライアントが同一のローカルネットワーク(LAN)に接続している場合は動作するが、 クラウド等の(自宅に置いていない)サーバでサーバ用プログラムを起動しておいて、それを自宅の クライアントから接続しようとすると接続できない。」 という事ですか? 状況が判るように、もう少し詳しく説明してください。
yukkyooooo

2015/08/07 09:56 編集

>kiriさん connectのエラーのところで if(connect(sock, (struct sockaddr *)&server, sizeof(server))){ printf("connect error: %d\n", WSAGetLastError()); } でエラー「connect error: 10060」と出ました
yukkyooooo

2015/08/07 10:18

>coco_bauer 外部ネットワークからアクセスするユーザはクライアント.exeを渡します。サーバは自宅に置きます。それでやってみたらできませんでした。addr.sin_addr.S_un.S_addr = INADDR_ANY;以外にもINADDR_BROADCASTやほかを試しても同様でした。またなぜかINADDR_ANY以外に設定して動作確認すると、サーバのほうに知らないIPが表示されます。 「142.17.63.117 PORT:0」と表示されます。カナダから接続されているようなんですが、これは何のIPかわかりますか?Wireshackなどで見てもわかりませんでした。別途で質問となるんですが回答いただければ助かります。
guest

回答1

0

自己解決

ESETのFWの設定でなぜかはじかれていたようです。
別WINDOWS7(Windows Defender)ではグローバルIP指定での通信が可能でした。
またセグメントが違う機器間でも通信できました。ESETが原因でした

サーバを設置しているほうのESETのFWを無効にした瞬間からつなげたので、
今回はFWが原因でした。

お騒がせしました。回答くださった2名の方ありがとうございます。
おかげで原因究明ができました

ちなみに今回試したこと
・自宅ローカル内 セグメントが異なる
CATVモデム==バファロルタ(IP:ClassC)=|=necルタ(IP:ClassA)
∟Share用サーバ(ClassC .5 ∟MainPC(ClassA .2)
・グローバル
クライアント側ー>Internetー>CATVモデム=以下略 ->Mainpc(サーバ設置)

以上

投稿2015/08/10 11:01

yukkyooooo

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問