winsocket网络编程客户端服务器通讯的一点小程序,刚接触网络编程,不太懂求指教
winsocket网络编程客户端服务器通信的一点小程序,刚接触网络编程,不太懂求指教
服务器端程序:
#include<stdio.h>
#include<WinSock2.h>
#include<string.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsaData; //被WSAStartup()调用后返回winsock的数据
if(WSAStartup(MAKEWORD(1,1),&wsaData)) //调用初始化函数 版本号为1.1
{
printf("Could not load windows sockets DLL\n");
return;
}
//创建用于监听的流式套接字
SOCKET listenSocket = socket(AF_INET,SOCK_STREAM,0);
if(listenSocket == SOCKET_ERROR) //创建失败
{
printf("invaild socket\n");
WSACleanup(); //释放为DLL或者应用程序分配的资源
return ;
}
sockaddr_in servAddress;
memset((void*)&servAddress,0,sizeof(servAddress));
servAddress.sin_family = AF_INET;
servAddress.sin_port = htons(5188);
servAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); //服务器ip地址
//将本地地址绑定到套接字
if(bind(listenSocket,(sockaddr*)&servAddress,sizeof(servAddress)))
{
printf("bind failed\n");
WSACleanup();
return ;
}
if(listen(listenSocket,5))
{
printf("listen failed\n");
WSACleanup();
return;
}
int visits = 0;
sockaddr_in clientAddress;
int addressLen = sizeof(clientAddress);
while(1)
{
SOCKET clientSocket = accept(listenSocket,(sockaddr*)&clientAddress,&addressLen);
if(clientSocket == INVALID_SOCKET)
{
printf("accept failed\n");
closesocket(listenSocket);
WSACleanup();
return;
}
char buf[1024];
sprintf(buf, "this serve has been contacted %d time\n",visits++);
send(clientSocket,buf,strlen(buf)+1,0);
/*获取客户机的点分十进制IP地址 赋给buf[]数组
................................................................
.................................................................
*/
printf("accepted %d time:from %s \n",visits,buf);
closesocket(clientSocket);
}
closesocket(listenSocket);
WSACleanup();
}
客户机端代码:
//#if(0)
#include<stdio.h>
#include<conio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wasData;
if(WSAStartup(MAKEWORD(1,1),&wasData))
{
printf("Could not load windows socket DLL\n");
return ;
}
sockaddr_in servAddress;
memset((void*)&servAddress,0,sizeof(servAddress));
servAddress.sin_family = AF_INET;
servAddress.sin_port = htons(5188);
char serverIP[256] = "127.0.0.1";
servAddress.sin_addr.s_addr= inet_addr(serverIP);
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
if(s == SOCKET_ERROR)
{
printf("invalid socket\n");
WSACleanup();
return;
}
if(connect(s,(sockaddr*)&servAddress,sizeof(servAddress)))
{
printf("connect failed\n");
WSACleanup();
return ;
}
/*获取客户机端的端口号
.........................
*/
char buf[1024];
int n = recv(s,buf,sizeof(buf),0);
if(n > 0)
{
buf[n] = '\0';
printf("%s",buf);
}
closesocket(s);
WSACleanup();
getch();
}
求问那里面的两句代码怎么写,自己查了一些东西,结果被许多接口搞混了,求各位指教 怎么写
最后运行的话 先运行服务器端程序 在运行客户机端程序
得到的结果应该是
服务器端的控制台框框中 显示 accept 1 times ;from (IP地址)
客户机端的控制台框框中 显示 the server has been contacted 1 times
------解决方案--------------------
没看到你提问的问题哎
------解决方案--------------------
你可以参考《WinSock网络编程经络》第15章,得到本机和对方的地址和端口用getpeername,getsockname,摘录内容如下:
服务器端程序:
#include<stdio.h>
#include<WinSock2.h>
#include<string.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsaData; //被WSAStartup()调用后返回winsock的数据
if(WSAStartup(MAKEWORD(1,1),&wsaData)) //调用初始化函数 版本号为1.1
{
printf("Could not load windows sockets DLL\n");
return;
}
//创建用于监听的流式套接字
SOCKET listenSocket = socket(AF_INET,SOCK_STREAM,0);
if(listenSocket == SOCKET_ERROR) //创建失败
{
printf("invaild socket\n");
WSACleanup(); //释放为DLL或者应用程序分配的资源
return ;
}
sockaddr_in servAddress;
memset((void*)&servAddress,0,sizeof(servAddress));
servAddress.sin_family = AF_INET;
servAddress.sin_port = htons(5188);
servAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); //服务器ip地址
//将本地地址绑定到套接字
if(bind(listenSocket,(sockaddr*)&servAddress,sizeof(servAddress)))
{
printf("bind failed\n");
WSACleanup();
return ;
}
if(listen(listenSocket,5))
{
printf("listen failed\n");
WSACleanup();
return;
}
int visits = 0;
sockaddr_in clientAddress;
int addressLen = sizeof(clientAddress);
while(1)
{
SOCKET clientSocket = accept(listenSocket,(sockaddr*)&clientAddress,&addressLen);
if(clientSocket == INVALID_SOCKET)
{
printf("accept failed\n");
closesocket(listenSocket);
WSACleanup();
return;
}
char buf[1024];
sprintf(buf, "this serve has been contacted %d time\n",visits++);
send(clientSocket,buf,strlen(buf)+1,0);
/*获取客户机的点分十进制IP地址 赋给buf[]数组
................................................................
.................................................................
*/
printf("accepted %d time:from %s \n",visits,buf);
closesocket(clientSocket);
}
closesocket(listenSocket);
WSACleanup();
}
客户机端代码:
//#if(0)
#include<stdio.h>
#include<conio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wasData;
if(WSAStartup(MAKEWORD(1,1),&wasData))
{
printf("Could not load windows socket DLL\n");
return ;
}
sockaddr_in servAddress;
memset((void*)&servAddress,0,sizeof(servAddress));
servAddress.sin_family = AF_INET;
servAddress.sin_port = htons(5188);
char serverIP[256] = "127.0.0.1";
servAddress.sin_addr.s_addr= inet_addr(serverIP);
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
if(s == SOCKET_ERROR)
{
printf("invalid socket\n");
WSACleanup();
return;
}
if(connect(s,(sockaddr*)&servAddress,sizeof(servAddress)))
{
printf("connect failed\n");
WSACleanup();
return ;
}
/*获取客户机端的端口号
.........................
*/
char buf[1024];
int n = recv(s,buf,sizeof(buf),0);
if(n > 0)
{
buf[n] = '\0';
printf("%s",buf);
}
closesocket(s);
WSACleanup();
getch();
}
求问那里面的两句代码怎么写,自己查了一些东西,结果被许多接口搞混了,求各位指教 怎么写
最后运行的话 先运行服务器端程序 在运行客户机端程序
得到的结果应该是
服务器端的控制台框框中 显示 accept 1 times ;from (IP地址)
客户机端的控制台框框中 显示 the server has been contacted 1 times
------解决方案--------------------
没看到你提问的问题哎
------解决方案--------------------
你可以参考《WinSock网络编程经络》第15章,得到本机和对方的地址和端口用getpeername,getsockname,摘录内容如下: