私は別のコンピュータから自分のPCに公開しようとしていますが、接続機能からエラーコード10060
を返します。公開鍵に接続するWinsockプログラミング
私がinet_addr("127.0.0.1")
のローカルマシン からサーバに接続し、クライアントと接続すると動作します。
私は下の同じクライアントコードでサーバーのパブリックIPに接続しようとしましたが、それは返す10060
誰でも助けることができますか?
サーバー
#include<winsock2.h>
int main(){
WSADATA ws;
SOCKET s, newSocket;
struct sockaddr_in server, client;
int c;
if(WSAStartup(MAKEWORD(2,2), &ws) != 0){
puts("error wsastartup");
printf("wsa error at %d", GetLastError());
}
if((s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
printf("socket error at %d", GetLastError());
}
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(8888);
server.sin_family = AF_INET;
if(bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR){
printf("socket error at %d", GetLastError());
}else{
puts("bind done");
}
listen(s, 3);
puts("Waiting for incoming connections");
c = sizeof(struct sockaddr_in);
char *message = "hello client i got ur message";
while((newSocket = accept(s, (struct sockaddr*) &client, &c)) != INVALID_SOCKET){
puts("connection accepted");
send(newSocket, message, strlen(message), 0);
}
if(newSocket == INVALID_SOCKET){
printf("accept failed iwth the code %d", GetLastError());
return 1;
}
getchar();
closesocket(s);
WSACleanup();
return 0;
}
これは、問題は、サーバーにあるクライアント
#include <winsock2.h>
int main(){
WSADATA ws;
SOCKET s;
struct sockaddr_in server;
char *message = "hello this is a message";
if(WSAStartup(MAKEWORD(2,2), &ws) != 0){
printf("wsa error at %d", GetLastError());
}else{
puts("wsa done");
}
if((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){
printf("invalid socket at %d", GetLastError());
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(8888);
if(connect(s, (struct sockaddr*)&server, sizeof(server)) < 0){
printf("connection err %d", GetLastError());
}else{
puts("connected");
}
return 0;
}
クライアントを実行しているマシンからパブリックIPにpingすることはできますか?そうであれば、サーバがlistenするルータのポートがルータ設定で転送されているかどうか確認する必要があります。 – Pras
'server.sin_addr.s_addr = inet_addr 0.1 ")。 - > server.sin_addr.s_addr = inet_addr( "0.0.0.0");これにより、すべてのインターフェイスでバインドされます。 –
注:サーバーは各接続で 'newSocket'をリークします。 –