3,881
社区成员
发帖
与我相关
我的任务
分享
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SERV_PORT 9527
#define MAXLINE 128
#define LISTENQ 5
#define MAXBUFSIZE 1024
void exit_msg(const char* msg) {
perror(msg);
exit(0);
}
int main(int argc, char* argv[]) {
int listenfd, connfd, cevents, idx, clilen, i, n;
struct sockaddr_in cliaddr, servaddr;
char buf[MAXBUFSIZE];
WSAEVENT event, wsaevents[WSA_MAXIMUM_WAIT_EVENTS];//<WinSock2.h> #define WSA_MAXIMUM_WAIT_EVENTS 64
WSANETWORKEVENTS net_events;
SOCKET sockets[WSA_MAXIMUM_WAIT_EVENTS];
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
exit_msg("bind error");
listen(listenfd, LISTENQ);
//1、创建并设置WSACreateEvent
event = WSACreateEvent();
WSAEventSelect(listenfd, event, FD_ACCEPT | FD_CLOSE);
cevents = 0;
wsaevents[cevents] = event;
sockets[cevents] = listenfd;
++cevents;
for (; ; ) {
//2、WSAWaitForMultipleEvents等待事件被触发
if ((idx = WSAWaitForMultipleEvents(cevents, wsaevents, FALSE, WSA_INFINITE, FALSE)) == WSA_WAIT_FAILED)
exit_msg("WSA_WAIT_FAILED");
if (idx == WSA_WAIT_TIMEOUT)
continue;
idx -= WSA_WAIT_EVENT_0;
//3、WSAEnumNetworkEvents获取具体发生的事件类型
WSAEnumNetworkEvents(sockets[idx], wsaevents[idx], &net_events);
WSAResetEvent(wsaevents[idx]);//4、设置事件为无信号状态
if (net_events.lNetworkEvents & FD_ACCEPT) {
puts("FD_ACCEPT");
if (net_events.iErrorCode[FD_ACCEPT_BIT] == 0) {
if (cevents >= WSA_MAXIMUM_WAIT_EVENTS)
exit_msg("too many clients");
clilen = sizeof(cliaddr);
connfd = accept(sockets[idx], (struct sockaddr*)&cliaddr, &clilen);
event = WSACreateEvent();
WSAEventSelect(connfd, event, FD_READ | FD_WRITE | FD_CLOSE);
wsaevents[cevents] = event;
sockets[cevents] = connfd;
++cevents;
}
}
if (net_events.lNetworkEvents & FD_READ) {
puts("FD_READ");
if (net_events.iErrorCode[FD_READ_BIT] == 0) {
if ((n = recv(sockets[idx], buf, MAXBUFSIZE, 0)) != 0)
send(sockets[idx], buf, n, 0); //TODO: send + while
}
}
if (net_events.lNetworkEvents & FD_WRITE) {
puts("FD_WRITE");
if (net_events.iErrorCode[FD_WRITE_BIT] == 0)
printf("FD_WRITE...(%d)\n", sockets[idx]);
}
if (net_events.lNetworkEvents & FD_CLOSE) {
puts("FD_CLOSE");
if (net_events.iErrorCode[FD_CLOSE_BIT] == 0) {
closesocket(sockets[idx]);
WSACloseEvent(wsaevents[idx]);//5、释放事件所占用的资源
for (i = idx; i < cevents - 1; ++i) {
wsaevents[i] = wsaevents[i + 1];
sockets[i] = sockets[i + 1];
}
--cevents;
}
}
}
WSACleanup();
return 0;
}
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SERV_PORT 9527
#define MAXLINE 128
void exit_msg(const char* msg) {
perror(msg);
exit(0);
}
void str_cli(FILE* fp, int sockfd) {
char buf[MAXLINE];
while (fgets(buf, MAXLINE, fp) != NULL) {
int n = send(sockfd, buf, strlen(buf), 0);
if (recv(sockfd, buf, MAXLINE, 0) == 0)
exit_msg("str_cli readline==0");
fputs(buf, stdout);
}
}
int main(int argc, char* argv[]) {
SOCKET sockfd;
WSADATA wsa;
struct sockaddr_in servaddr;
/*if (argc != 2)
exit_msg("argv != 2");*/
WSAStartup(MAKEWORD(2, 2), &wsa);
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_port = htons(SERV_PORT);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.S_un.S_addr = inet_addr(/*argv[1]*/"127.0.0.1");
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
exit_msg("connect error !");
}
str_cli(stdin, sockfd);
closesocket(sockfd);
WSACleanup();
return 0;
}