[TCP编程]
服务端:
1、加载套接字,版本号,创建协议:socket();(服务端地址可接受任何IP)
2、绑定IP,端口 接口sockaddr_in 方法:bind();
3、增加监听 list;
4、循环接收数据 accept()接受客户端的请求;
4、发送,接受:send(),recv().
#include <stdio.h>
#include <winSock2.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib")
#define SERVER_PORT 3947
bool isRunning = false;
SOCKET ServerSocket;
SOCKET ClientSoket;
sockaddr_in serverAddr_in;
sockaddr_in clientAddr_in;
DWORD wVertionRequestion = MAKEWORD(2,2);
WSADATA wsaData;
char rec[255];
typedef struct CLIENT
{
SOCKET client;
char name[20];
bool isFightding;
SOCKET enemy;
char enemyName[20];
struct CLIENT *next;
}ClientNode,*CLientList;
typedef struct CLIENTSERVER
{
int size;
CLientList head;
}ClientServer;
void sendMsg(char *content, char x, char y)
{
CLientList p = SClient.head->next;
char name[255];
char infor[255];
split(content,':',name,infor);
if (SClient.size <= 1)
{
return;
}
while (p&&strcmp(name, p->name))
{
p = p->next;
}
if (p != NULL)
{
send(p->enemy, infor, strlen(infor), 0);
}
return;
}
DWORD WINAPI reciveMsg(LPVOID parameter)
{
int rc;
CLientList p;
while (isRunning)
{
p = SClient.head->next;
while (p)
{
rc = recv(p->client, rec, sizeof(rec), 0);
if (rc >= 0)
{
rec[rc] = 0x00;
sendMsg(rec, 1, 2);
}
if (rc < 0)
{
printf("%s已退出\n", p->name);
removeClient(p->name);
break;
}
p = p->next;
}
}
return NULL;
}
DWORD WINAPI startHere(LPVOID parameter)
{
char name[20];
int len;
int add_len = sizeof(clientAddr_in);
while (true)
{
printf("请等候...\n");
ClientSoket = accept(ServerSocket, (sockaddr *)&clientAddr_in, &add_len);
if (ClientSoket == INVALID_SOCKET)
{
perror("accept");
}
isRunning = true;
len = recv(ClientSoket, name, sizeof(name), 0);
if (len > 0)
{
name[len] = 0x00;
}
if (len < 0)
{
isRunning = false;
}
printf("建立了与客户端:%s 的链接 IP地址:%s\n", name, inet_ntoa(clientAddr_in.sin_addr));
createClientList(SClient.head, ClientSoket, name);
SClient.size++;
if (SClient.size % 2 == 0)
{
matchEnemy(ClientSoket);
}
CreateThread(NULL, 0, reciveMsg, NULL, 0, NULL);
displayClient(SClient.head);
}
return NULL;
}
int main()
{
srand((int)time(0));
if (WSAStartup(wVertionRequestion, &wsaData) != 0)
{
perror("load socket ");
}
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
serverAddr_in.sin_family = AF_INET;
serverAddr_in.sin_port = htons(SERVER_PORT);
serverAddr_in.sin_addr.s_addr = INADDR_ANY;
if (bind(ServerSocket, (sockaddr *)&serverAddr_in, sizeof(serverAddr_in)) == SOCKET_ERROR)
{
perror("bind ");
}
if (listen(ServerSocket, 5) == INVALID_SOCKET)
{
perror("listen ");
}
CreateThread(NULL, 0, startHere, NULL, 0, NULL);
while (true)
{
}
return 0;
}
## 客服端:
1、加载套接字,版本号,创建协议:socket();(设置IP,地址族...)
2、与服务器建立链接 connect();
3、发送,接受:send(),recv().**
```c
#include <winSock2.h>
#include <stdio.h>
#include <conio.h>
#pragma comment(lib,"ws2_32.lib")
#define SERVER_PORT 3947
char name[20];
SOCKET ServerSocket;
sockaddr_in serveraddr_in;
DWORD wVertionRequestied = MAKEWORD(2,2);
WSADATA wsaData;
DWORD WINAPI recive(LPVOID parameter)
{
char x, y;
int rc;
char rec[255];
while (true)
{
rc = recv(ServerSocket, rec, sizeof(rec), 0);
if (rc > 0)
{
rec[rc] = 0x00;
printf("%s\n",rec);
}
}
}
DWORD WINAPI sendMsg(LPVOID parameter)
{
char sendData[255];
char pos[5];
int name_len = strlen(name);
while (true)
{
scanf("%s", pos);
strcat(name, ":");
strcat(name, pos);
send(ServerSocket, name, strlen(name), 0);
name[name_len] = 0x00;
}
return NULL;
}
int main()
{
int nErr = WSAStartup(wVertionRequestied, &wsaData);
if (nErr != 0)
{
perror("load socket ");
}
ServerSocket = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
serveraddr_in.sin_family = AF_INET;
serveraddr_in.sin_port = htons(SERVER_PORT);
serveraddr_in.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(ServerSocket, (sockaddr *)&serveraddr_in, sizeof(serveraddr_in)) == SOCKET_ERROR)
{
perror("connect ");
}
CreateThread(NULL,0,recive,NULL,NULL,NULL);
printf("请输入你的姓名:");
scanf("%s", name);
send(ServerSocket,name,strlen(name),0);
printf("对话框:\n");
printf("##################################################################\n");
CreateThread(NULL, 0, sendMsg, NULL, 0, NULL);
while (true)
{
}
closesocket(ServerSocket);
WSACleanup();
}