我是网络编程的新手,开始学习如何在C中使用WinSock。
我现在对网络没有任何了解。
无论如何,我使用WinSock为Client和Server编写了以下代码。
服务器:
#include #include #include #include #define MY_ERROR 1 #define PORT 7777 #define MAX_NUM_CLIENTS 1 /* I don't know how to thread right now. */ #define MAX_CLIENT_MSG_LEN 1000 int main() { WSADATA wsa; SOCKET mySocket, acceptSocket; struct sockaddr_in server, client; int sockAddrInLength = sizeof(struct sockaddr_in); char clientMessage[MAX_CLIENT_MSG_LEN]; int clientMessageLength; char* message; int running = 1; if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) { fprintf(stderr, "WSAStartup failed.n"); return MY_ERROR; } printf("WSAStartup succeded.n"); mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (mySocket == INVALID_SOCKET) { fprintf(stderr, "Socket creation failed.n"); return MY_ERROR; } printf("Socket creation succeeded.n"); server.sin_addr.s_addr = INADDR_ANY; server.sin_family = AF_INET; server.sin_port = htons(PORT); if (bind(mySocket, (struct sockaddr*) &server, sizeof server) == SOCKET_ERROR) { fprintf(stderr, "Binding socket on port %d failed.n", PORT); return MY_ERROR; } printf("Binding socket on port %d successfully.n", PORT); while (running) { listen(mySocket, MAX_NUM_CLIENTS); printf("Waiting for a connection...n"); acceptSocket = accept(mySocket, (struct sockaddr*) &client, &sockAddrInLength); if (acceptSocket == INVALID_SOCKET) { fprintf(stderr, "Accept failed.n"); return MY_ERROR; } printf("Accept succeeded.n"); if ((clientMessageLength = recv(acceptSocket, clientMessage, sizeof clientMessage, 0)) == SOCKET_ERROR) { fprintf(stderr, "Recv failed.n"); return MY_ERROR; } printf("Recv succeeded.n"); printf("Data:n"); clientMessage[clientMessageLength] = NULL; /* Null terminator */ printf("Client: %sn", clientMessage); message = "Hello client, I'm the server. Bye bye. :-)n"; if (send(acceptSocket, message, strlen(message), 0) < 0) { fprintf(stderr, "Send failed.n"); return MY_ERROR; } printf("Send succeded.n"); } closesocket(mySocket); WSACleanup(); getchar(); return 0; }
这是客户的代码:
#include #include #include #include #define IP /* My IP */ #define MY_ERROR 1 #define PORT 7777 #define MAX_SERVER_MSG_LEN 1000 int main() { WSADATA wsa; SOCKET mySocket; struct sockaddr_in server; char* message; char serverMessage[MAX_SERVER_MSG_LEN]; int serverMessageLength; if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) { fprintf(stderr, "WSAStartup failed.n"); getchar(); return MY_ERROR; } printf("WSASucceeded.n"); mySocket = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); if (mySocket == INVALID_SOCKET) { fprintf(stderr, "Socket creation failed.n"); getchar(); return MY_ERROR; } server.sin_addr.s_addr = inet_addr(IP); server.sin_family = AF_INET; server.sin_port = htons(PORT); if (connect(mySocket, (struct sockaddr*) &server, sizeof server) < 0) { fprintf(stderr, "Connection failed. error: %sn",WSAGetLastError()); getchar(); return MY_ERROR; } printf("Connection established.n"); message = "Hello server, I'm the sweet client. :-)n"; if (send(mySocket, message, strlen(message), 0) < 0) { fprintf(stderr, "Sending failed.n"); return MY_ERROR; } printf("Sending succeeded.n"); if ((serverMessageLength = recv(mySocket, serverMessage, sizeof serverMessage, 0)) == SOCKET_ERROR) { fprintf(stderr, "Recv failed.n"); return MY_ERROR; } printf("Recv succeeded.n"); printf("Data:n"); serverMessage[serverMessageLength] = NULL; printf("Server: %s", serverMessage); closesocket(mySocket); getchar(); return 0; }
好。
当我在我的comupter上运行服务器和客户端,并将IP(在客户端代码中)定义为我的内部IP(我认为,因为它是192.168.xx的forms)它工作正常。
当我将IP定义为我的外部IP时,它在我的计算机上不起作用(当我在我的计算机上运行两个程序时)。 连接失败。
另外 – 当我试图在任何其他计算机上运行客户端时,它不起作用(当IP被定义为我的内部或我的外部IP)时,连接失败。
我的问题是:
如果您有任何文章/类似的东西,以便让我更好地了解问题,它也可能有所帮助。
非常感谢你! ?
这看起来不像编码问题,而是网络配置问题。
让我试着改写一下你所说的话:如果我误解了,请纠正我: –
但是,您还通过不同的“外部”IP地址连接到互联网 – 当您的客户端尝试通过此地址访问服务器时,它会失败。 ( WSAGetLastError
的确切错误代码在这里很有用,请)
在这一点上,这取决于你如何连接到网络。 让我们假设一个典型的家庭办公场景。 您有宽带,ADSL路由器/调制解调器为您提供网络连接。 现在,虽然路由器将具有“外部”IP地址,但本地网络上的PC通常不会。 因此,如果您尝试连接到“外部”IP,您实际上是在尝试与路由器通信。
这是端口转发发挥作用的地方。 您需要将路由器配置为将端口7777转发到内部网络上服务器的正确IP地址。 你会在你的路由器上找到这样的屏幕。
您可以为’from’和’to’输入端口7777,启用TCP,并指定服务器的LAN地址。 然后,路由器将端口7777上的传入连接转发到指定的服务器。
以上就是c/c++开发分享C中的WinSock程序仅适用于本地计算机相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549921.html