本来想写个聊天系统,暂时水平有限,不浪费时间,以后再补上吧
服务器代码:
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#pragma comment (lib, "ws2_32.lib")
using namespace std;
void main()
{
//windows特有 使用WSAStarup() 初始化套接字库。相当于分配网络资源
WSADATA wsaData;
int err = WSAStartup(0x0101, &wsaData);
if (err != 0 )
{
return;
}
//windows特有 设置网络库的版本
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
//windows 特有 对应的网络资源释放
WSACleanup();
return;
}
//创建套接字 AF_INET 代表IPV4 SOCK_STREAM socket类型 0指定协议类型 0默认IPPROTO_TCP tcp协议
SOCKET sockServ = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockServ)
{
WSACleanup(); //这时候只是设置 socket参数 并没有创建 所以不需要closeSocket(sock_id);
return;
}
// 上面同linux socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1
SOCKADDR_IN addrServ;
//ip地址设置为 INADDR_ANY,让系统自动获取本机地址
addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl 转换ip地址格式的函数
addrServ.sin_port = htons(6000);//设置端口号6000
addrServ.sin_family = AF_INET; //IPV4
//把地址组中特定的地址 赋值给socket
err = bind(sockServ, (SOCKADDR*)&addrServ, sizeof(SOCKADDR));
if (0 != err)
{
WSACleanup();//这时候也没有真正的创建socket 也是再设置必要的参数
return;
}
//这时候真正创建了socket 监听该socket 设置最大连接数量
listen(sockServ, SOMAXCONN);
//循环监听客户端请求 这里将会存储每个客户端的信息 比如ip 端口
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
//接受客户端请求 客户端信息放在addrClient 如果不关心 后面连个参数都可以设为NULL
//阻塞直到有客户端连接,不然多浪费CPU资源。
SOCKET sockConn = accept(sockServ, (SOCKADDR*)&addrClient, &len);
char sendBuf[255];
cin >> sendBuf ;
//send 向客户端发送数据
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
char recvBuf[255];
//接受客户端传来的数据 接受的数据写入到recvBuf
int nRecv = recv(sockConn, recvBuf, 255, 0);
if (nRecv > 0)
{
recvBuf[nRecv] = '\0';
printf("%s\n", recvBuf);
}
if (strcmp(recvBuf, "88") == 0)
closesocket(sockConn);
}
closesocket(sockServ);
}
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#pragma comment (lib, "ws2_32.lib")
using namespace std;
void main()
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1, 1); //设置请求套接字1.1版本
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return;
//检查是否是1.1版本 不是返回
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
//创建socket IPV4 socket type SOCK_STREAM 0代表默认TCP协议
SOCKET sockConn = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrServ;
addrServ.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//设置连接的地址
addrServ.sin_family = AF_INET; //IPV4
addrServ.sin_port = htons(6000); //设置连接的端口号
while(1)
{
//连接设置的服务器
connect(sockConn, (SOCKADDR *)&addrServ, sizeof(SOCKADDR));
char recvBuf[255] ="\0";
//接受服务器发来的数据
recv(sockConn, recvBuf, 255, 0);
if (strcmp(recvBuf, "") != 0 )
cout << recvBuf << endl;
char sendBuf[255];
cin >> sendBuf ;
//向服务器发送数据
send(sockConn, sendBuf, strlen(sendBuf), 0);
sendBuf[strlen(sendBuf)] = '\0';
if (strcmp(sendBuf, "88") == 0 )
break;
}
//关闭socket
closesocket(sockConn);
//释放分配的网络资源
WSACleanup();
}
原文:http://blog.csdn.net/tutuboke/article/details/45799667