我有一個問題,到目前爲止我不知道如何通過它。 我已經創建了標準的服務器和客戶端通過Windows套接字,它在我的電腦上正常工作(如果我運行服務器,然後運行它們連接的客戶端),但我不知道如何使其工作也服務器在計算機上運行時我的朋友(他運行服務器部分)和客戶端在我的PC上啓動。 他的IP:192.168.1.6 我的IP:192.168.1.2 爲什麼我無法連接到我的服務器應用程序運行在他的機器上? 它應該工作嗎?除了建立連接之外,我還必須做些什麼嗎?套接字:客戶端無法連接到其他電腦/服務器
服務器:
// C++ from Visual Studio 2008 Pro Edition
//#include "stdafx.h"
#include
#include
#include
#include
//#pragma comment(lib, "ws2_32.lib") //not necessary becouse additional dependency added to linker
// Microsoft Development Environment 2003 - Version 7.1.3088
// Copyright (r) 1987-2002 Microsoft Corporation. All Right Reserved
// Microsoft .NET Framework 1.1 - Version 1.1.4322
// Copyright (r) 1998-2002 Microsoft Corporation. All Right Reserved
// Run on Windows XP Pro machine, version 2002, SP 2
// already included
// WINVER = 0x0501 for Xp already defined in windows.h
int main(){
WORD wVersionRequested;
WSADATA wsaData={0};
int wsaerr;
// Using MAKEWORD macro, Winsock version request 2.2
wVersionRequested = MAKEWORD(2, 2);
wsaerr = WSAStartup(wVersionRequested, &wsaData);
if (wsaerr != 0){
/* Tell the user that we could not find a usable WinSock DLL.*/
printf("Server: The Winsock dll not found!\n");
return 0;
}else{
printf("Server: The Winsock dll found!\n");
printf("Server: The status: %s.\n", wsaData.szSystemStatus);
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){
/* Tell the user that we could not find a usable WinSock DLL.*/
printf("Server: The dll do not support the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));
WSACleanup();
return 0;
}else{
printf("Server: The dll supports the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));
printf("Server: The highest version this dll can support: %u.%u\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
}
//////////Create a socket////////////////////////
//Create a SOCKET object called m_socket.
SOCKET m_socket;
// Call the socket function and return its value to the m_socket variable.
// For this application, use the Internet address family, streaming sockets, and the TCP/IP protocol.
// using AF_INET family, TCP socket type and protocol of the AF_INET - IPv4
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// Check for errors to ensure that the socket is a valid socket.
if (m_socket == INVALID_SOCKET){
printf("Server: Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
//return 0;
}else{
printf("Server: socket() is OK!\n");
}
////////////////bind//////////////////////////////
// Create a sockaddr_in object and set its values.
sockaddr_in service;
// AF_INET is the Internet address family.
service.sin_family = AF_INET;
// "127.0.0.1" is the local IP address to which the socket will be bound.
service.sin_addr.s_addr = htons(INADDR_ANY); //inet_addr("192.168.1.2");
// 55555 is the port number to which the socket will be bound.
// using the htons for big-endian
service.sin_port = htons(55555);
// Call the bind function, passing the created socket and the sockaddr_in structure as parameters.
// Check for general errors.
if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR){
printf("Server: bind() failed: %ld.\n", WSAGetLastError());
closesocket(m_socket);
//return 0;
}else{
printf("Server: bind() is OK!\n");
}
// Call the listen function, passing the created socket and the maximum number of allowed
// connections to accept as parameters. Check for general errors.
if (listen(m_socket, 1) == SOCKET_ERROR)
printf("Server: listen(): Error listening on socket %ld.\n", WSAGetLastError());
else{
printf("Server: listen() is OK, I'm waiting for connections...\n");
}
// Create a temporary SOCKET object called AcceptSocket for accepting connections.
SOCKET AcceptSocket;
// Create a continuous loop that checks for connections requests. If a connection
// request occurs, call the accept function to handle the request.
printf("Server: Waiting for a client to connect...\n");
printf("***Hint: Server is ready...run your client program...***\n");
// Do some verification...
while (1){
AcceptSocket = SOCKET_ERROR;
while (AcceptSocket == SOCKET_ERROR){
AcceptSocket = accept(m_socket, NULL, NULL);
}
// else, accept the connection...
// When the client connection has been accepted, transfer control from the
// temporary socket to the original socket and stop checking for new connections.
printf("Server: Client Connected!\n");
m_socket = AcceptSocket;
break;
}
system("pause");
return 0;
}
客戶:
// C++ from Visual Studio 2008 Pro Edition
//#include "stdafx.h"
#include
#include
#include
#include
//#pragma comment(lib, "ws2_32.lib") //not necessary becouse additional dependency added to linker
// Microsoft Development Environment 2003 - Version 7.1.3088
// Copyright (r) 1987-2002 Microsoft Corporation. All Right Reserved
// Microsoft .NET Framework 1.1 - Version 1.1.4322
// Copyright (r) 1998-2002 Microsoft Corporation. All Right Reserved
// Run on Windows XP Pro machine, version 2002, SP 2
// already included
// WINVER = 0x0501 for Xp already defined in windows.h
// A sample of client program
int main(){
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Client: Error at WSAStartup().\n");
else
printf("Client: WSAStartup() is OK.\n");
// Create a socket.
SOCKET m_socket;
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET){
printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 7;
}else
printf("Client: socket() is OK.\n");
// Connect to a server.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
//clientService.sin_addr.s_addr = inet_addr("77.64.240.156");
clientService.sin_addr.s_addr = inet_addr("192.168.1.6");
clientService.sin_port = htons(55555);
if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR){
printf("Client: connect() - Failed to connect.\n");
WSACleanup();
return 6;
}
// Send and receive data
int bytesSent;
int bytesRecv = SOCKET_ERROR;
// Be careful with the array bound, provide some checking mechanism
char sendbuf[200] = "Client: Sending some test string to server...";
char recvbuf[200] = "";
bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);
printf("Client: send() - Bytes Sent: %ld\n", bytesSent);
while(bytesRecv == SOCKET_ERROR){
bytesRecv = recv(m_socket, recvbuf, 32, 0);
if (bytesRecv ...
return 0;
}
是你朋友的PC在同一網絡上嗎?如果不是這樣,這些IP就沒用了,並且不能通過互聯網工作。你需要他的外部IP,有網站找出:http://www.whatismyip.com/ – pezcode 2012-01-10 20:49:02
我不知道你可以調用「接受」,而不傳遞一個sockaddr_in和長度指針參數。剛查過MSDN,似乎沒問題。有趣。 – selbie 2012-01-13 10:07:10