winsock一个简单的例子

这几天从网上down了一个简单的winsock例子。源码如下:

//服务器的源码

#include <Winsock2.h>
#include <stdio.h>
#define ServerThread
#define _getch
void main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 1, 1 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return;
 }
 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
  WSACleanup( );
  return;
 }
 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //创建socket 名字是sockSrv

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(54188);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //bind将我们刚创建的套接字和sockaddr_in结构联系起来

 listen(sockSrv,5); //listen命令套接字监听来自客户端的连接。5代表最大连接数


 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);

 while(1)
 {
  SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
  char sendBuf[100];
  sprintf(sendBuf,"Welcome %s to you",
   inet_ntoa(addrClient.sin_addr));
  send(sockConn,sendBuf,strlen(sendBuf)+1,0);
  char recvBuf[100];
  recv(sockConn,recvBuf,100,0);
  printf("%s/n",recvBuf);
  closesocket(sockConn);
 }
}

 

//客户端源码

#include <Winsock2.h>
#include <stdio.h>

void main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 1, 1 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return;
 }
 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
  WSACleanup( );
  return;
 }
 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(54188);
 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 char recvBuf[100];
 recv(sockClient,recvBuf,100,0);
 printf("%s/n",recvBuf);
 strcpy(recvBuf,"我连接到你了");
 send(sockClient,recvBuf,sizeof(recvBuf)+1,0);

 closesocket(sockClient);
 WSACleanup();
}

 

这2段代码在VC++6.0上运行,编译的时候,会提示link。exe错误,解决方法:选中工程-设置-连接,在库模块中增加:ws2_32.lib。再次编译,通过!

分别在DUBUG中运行Ser.exe和Client。exe,可以看到ser的窗口上显示:我连接到你了。说明这个C/S是通的。

接下来我用LoadRunner的winsock协议来录制client连接ser,就是录制不到内容?这是为什么呢?原来127.0.0.1是回环地址,位于数据链路层。而TCP/IP位于传输层和网络层,ping127.0.0.1是在链路层内工作,不经过其他层。所有我们LR录制不到了。于是把127.0.0.1改成本机的IP:192.168.1.100.再次录制,录制成功。

 

 

好的,以下是一个简单的基于 Winsock 的 C/S 通讯例子,其客户端和服务器端都是使用 C 语言编写的。 服务器端代码: ```c #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsa; SOCKET server_sock, client_sock; struct sockaddr_in server_addr, client_addr; int client_addr_size = sizeof(client_addr); char buffer[1024] = {0}; // 初始化 Winsock if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("Failed. Error Code : %d", WSAGetLastError()); return 1; } // 创建服务器端套接字 if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("Could not create socket : %d", WSAGetLastError()); WSACleanup(); return 1; } // 初始化服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8888); // 绑定服务器端套接字 if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) { printf("Bind failed with error code : %d", WSAGetLastError()); closesocket(server_sock); WSACleanup(); return 1; } // 监听客户端连接请求 listen(server_sock, 3); printf("Server listening on port 8888...\n"); // 接收客户端连接并处理 while ((client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_addr_size)) != INVALID_SOCKET) { printf("Connection accepted from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // 接收客户端数据并回复 while (1) { // 接收客户端数据 int num_bytes = recv(client_sock, buffer, sizeof(buffer), 0); if (num_bytes == SOCKET_ERROR) { printf("recv failed with error code : %d", WSAGetLastError()); closesocket(client_sock); WSACleanup(); return 1; } if (num_bytes == 0) { printf("Connection closed by client.\n"); closesocket(client_sock); break; } // 处理客户端数据 buffer[num_bytes] = '\0'; printf("Received message from %s:%d: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer); // 回复客户端数据 if (send(client_sock, buffer, num_bytes, 0) == SOCKET_ERROR) { printf("send failed with error code : %d", WSAGetLastError()); closesocket(client_sock); WSACleanup(); return 1; } } } // 关闭服务器端套接字 closesocket(server_sock); // 清理 Winsock WSACleanup(); return 0; } ``` 客户端代码: ```c #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsa; SOCKET sock; struct sockaddr_in server_addr; char buffer[1024] = {0}; // 初始化 Winsock if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("Failed. Error Code : %d", WSAGetLastError()); return 1; } // 创建客户端套接字 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("Could not create socket : %d", WSAGetLastError()); WSACleanup(); return 1; } // 初始化服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8888); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 连接服务器端套接字 if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { printf("Connect failed with error code : %d", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } printf("Connected to server.\n"); // 发送数据到服务器端并接收回复 while (1) { // 发送数据到服务器端 printf("Enter message: "); gets_s(buffer, sizeof(buffer)); if (send(sock, buffer, strlen(buffer), 0) == SOCKET_ERROR) { printf("send failed with error code : %d", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } // 接收服务器端回复 int num_bytes = recv(sock, buffer, sizeof(buffer), 0); if (num_bytes == SOCKET_ERROR) { printf("recv failed with error code : %d", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } if (num_bytes == 0) { printf("Connection closed by server.\n"); closesocket(sock); break; } // 处理服务器端回复 buffer[num_bytes] = '\0'; printf("Received message from server: %s\n", buffer); } // 关闭客户端套接字 closesocket(sock); // 清理 Winsock WSACleanup(); return 0; } ``` 这个例子简单地实现了一个回显服务器,客户端向服务器发送数据,服务器接收到数据后将其回传给客户端。你可以在这个例子的基础上进行扩展和修改,以满足你的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值