Win32 socket简单实例
来源:互联网 发布:php的面向对象 编辑:程序博客网 时间:2024/05/21 21:40
#pragma comment(lib, "Ws2_32.lib")
#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <process.h>
#define _LINK_PORT_ 8088
#define _BUFFER_LENGTH_ 512
#define _DEFAULT_PORT_ "12345"
//接受客户端消息的线程函数
unsigned __stdcall ThreadRecv(LPVOID param)
{
SOCKET ListenSocket = (SOCKET)param;
SOCKET sockClient = INVALID_SOCKET;
printf("start accept...\n");
sockClient = accept(ListenSocket, NULL, NULL);
printf("end accept...\n");
if(INVALID_SOCKET == sockClient)
{
printf("accept failed:%d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
char recvBuf[_BUFFER_LENGTH_] = {0};
int nRecv = 0;
while( SOCKET_ERROR != nRecv)
{
nRecv = recv(sockClient, recvBuf, _BUFFER_LENGTH_, 0);
printf("ClinetSocket=%d, received count=%d\n", sockClient, nRecv);
if(SOCKET_ERROR == nRecv)
{
//标记当前线程为有信号
_endthreadex(0);
printf("recv failed! current thread's state is signaled! error=%d, clientsocket=%d", WSAGetLastError(), sockClient);
}
}
//关闭Socket
printf("ClientSocket=%d, thread closing...\n", sockClient);
shutdown(sockClient, SD_BOTH);
closesocket( sockClient );
return 0;
}
int main()
{
struct addrinfo *result = NULL,
*ptr = NULL,
hints;
int iResult;
//Initialize winsocket
WSADATA wsaData;
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_IP;
hints.ai_flags = AI_PASSIVE;
//Resolve the local address and port to be used by the server;
iResult = getaddrinfo(NULL, _DEFAULT_PORT_, &hints, &result);
if(iResult != 0)
{
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
return 1;
}
//Create a SOCKET for the server to listen for client connections
SOCKET ListenSocket = INVALID_SOCKET;
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if(INVALID_SOCKET == ListenSocket)
{
printf("Error at socket(): %d\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
//Setup the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, result->ai_addrlen);
if(iResult == SOCKET_ERROR)
{
printf("bind failed: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//Listen connection
if(listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
{
printf("Error at bind():%d \n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
while(true)
{
SOCKET sockClient = INVALID_SOCKET;
unsigned threadId;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &ThreadRecv,(void*)ListenSocket, 0, &threadId);
printf("waitting for ClinetSocket to finish...\n");
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
WSACleanup();
return 0;
}
客户端:
#pragma comment(lib, "Ws2_32.lib")
#include <stdio.h>
#include <WinSock2.h>
#define _BUFFER_LENGTH_ 512
#define _DEFAULT_PORT_ 12345
void main(int argc, char* argv[])
{
//Initialize Winsocket
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if( NO_ERROR != iResult)
printf("Error at WSAStartup()\n");
//Create a SOCKET for connecting to server;
SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ConnectSocket == INVALID_SOCKET)
{
printf("Error at socket():%ld\n", WSAGetLastError());
WSACleanup();
return;
}
//-----------------
//the sockaddr_in structure specifies the address family,
//IP address, and port of the server to be connected to.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
clientService.sin_port = htons(_DEFAULT_PORT_);
//Connect to server
int connRS = connect(ConnectSocket, (SOCKADDR*)&clientService, sizeof(clientService));
if( SOCKET_ERROR == connRS )
{
printf("Failed to connect.\n");
WSACleanup();
return;
}
printf("Connected to server.\n");
char* sendBuf = "this's a test";
char recvBuf[_BUFFER_LENGTH_] = {0};
//Send an initial buffer
iResult = send(ConnectSocket, sendBuf, strlen(sendBuf), 0);
if(iResult == SOCKET_ERROR)
{
printf("send failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return;
}
printf("Bytes send:%d\n", iResult);
//receive data
do{
iResult = recv(ConnectSocket, recvBuf, _BUFFER_LENGTH_, 0);
if(iResult > 0)
printf("Bytes received: %d\n", iResult);
else if(iResult == 0)
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
}while(iResult > 0);
//shutdown the connection for sending since no more data will be sent;
iResult = shutdown(ConnectSocket, SD_SEND);
if(iResult == SOCKET_ERROR)
{
printf("shutdown failed:%d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return;
}
WSACleanup();
return;
}
上一篇:Firefox在线收藏插件及快车插件
下一篇:DirectX笔记
- 浅析MySQL数据库OLTP基准测试...
- MySQL执行计划分析工具EXPLAIN...
- 主流MySQL集群实现架构优劣势...
- DB210.5.5存在Bug打补丁到10.5...
- softRoCE/RDMA 安装与测试...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
- Win32 socket简单实例
- win32共享内存简单实例
- [网络编程]Win32 Socket+OpenSSL实例
- Socket编程简单实例
- SOCKET简单实例
- Socket简单实例
- 简单socket编程实例
- Socket简单实例
- PHP Socket 简单实例
- android socket 简单实例
- Socket编程简单实例
- Socket 服务器端 简单实例
- windows socket 简单实例
- JAVA Socket简单实例
- socket简单实例
- socket简单文件传输实例
- Java Socket简单实例
- java socket简单实例
- VC编译器选项【转】
- 解析fastJson
- MSDN中的收藏夹备份或导出
- Building MFC application with /MD[d] (CRT dll vers
- Firefox在线收藏插件及快车插件
- Win32 socket简单实例
- DirectX笔记
- Telnet模拟HTTP请求【转】
- Direct3D和openGL故事【转】
- 【转】printf格式控制(你所不知道的printf妙用)
- 【转】Notepad++,Eclipse和Visual Studio 2005常用快捷键对比
- 无法打开包括文件:'atlrx.h'的解决办法[原]
- 傻傻的js
- 图像处理(四)图像分割(2)测地距离Geodesic图割