您的位置:首页 > 编程语言 > C语言/C++

C语言编写Socket监听处理程序一例

2011-11-14 18:56 495 查看
//C语言编写Socket监听处理程序一例
//服务器端
//--------------------------------------------------------------------------------------------
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <fstream>
#include <iostream>
#include <ole2.h>
#include <conio.h>

#pragma comment(lib,"WS2_32.lib")

#define   MAX_PENDING_CONNECTS   4

//声明函数
void tt(void);
DWORD WINAPI HandleSocket(LPVOID lpParam);

//程序入口点
int _tmain(int argc, _TCHAR* argv[])
{
tt();
//stop screen method 1
char q;
cin>>q;
//stop screen method 2
//getchar();
return 0;
}

//#include <winsock2.h>  //放在最顶端的.h中开头处
//#include <stdio.h>
//#include <stdlib.h>
//#pragma comment(lib,"WS2_32.lib")
void tt(void)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

//版本请求
wVersionRequested = MAKEWORD( 1, 1 );
//初始化WinSock(WSAStartup函数)
err = WSAStartup( wVersionRequested, &wsaData);
if ( err != 0 )
{  //初始化出错了退出函数
return;
}
//初始化成功!但版本不一致! 退出函数
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( ); //清除Socket
return;        //退出函数
}
//生成一个socket(sockSrv变量)
//SOCK_STREAM  用于TCP协议
//SOCK_DGRAM   用于UDP协议
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);  //使用TCP协议
//设置一个地址Socket(addrSrv变量)
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.232"); //本机IP地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);                 //端口6000
//绑定函数(指定本地IP地址所使用的端口号时候使用)
//(把sockSrv变量与addrSrv变量绑定在一起)
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//监听端口开始
if(listen(sockSrv,MAX_PENDING_CONNECTS)!=0)
{
printf("listen(sock)   failed:   %d\n ",::WSAGetLastError());
return;//ExitProcess(STATUS_FAILED);
}
printf("开始监听...");

//接收来自客户端的请求连接
SOCKET sockClient;
SOCKADDR_IN addrClient;//定义一个客户端Socket地址
int len=sizeof(SOCKADDR);
char recvBuf[100];
int recv_len=-1;
//
sockaddr_in	 acc_sin;
int	 acc_sin_len;
acc_sin_len=sizeof(acc_sin);
//
while(true)
{
//接收Socket请求   来自客户端的Connect
sockClient=accept(sockSrv,(struct sockaddr*)&acc_sin, &acc_sin_len);
if(sockClient>=0)
{
//创建一个线程来处理socket请求threadHandle
DWORD id;
HANDLE  threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE)HandleSocket,(LPVOID)sockClient, 0, &id);

////接收数据并保存到recvBuf变量中
//recv_len=recv(sockClient,recvBuf,100,0);
////recv_len=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
//while(recv_len>=0)
//{
// if (recv_len==0)
// {
//	 printf("本次接收的没有数据,是响应客户端连接信息!\n ");
// }
// else
// {
//	 //输出数据
//	 recvBuf[recv_len]='\0'; //在末尾加入字符串结束符号 '\0 '
//	 printf("%s\n",recvBuf);
//	 printf("本次数据接收结束。\n ");
// }
// recv_len=recv(sockClient,recvBuf,100,0);//recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
//}
}
else
{ //没有客户端接入
printf("没有客户端接入2\n");
}
Sleep(200);
}
//关闭Socket变量sockSrv
closesocket(sockSrv);
//清除Socket
WSACleanup();
}

DWORD WINAPI HandleSocket(LPVOID lpParam)
{
SOCKET sockClient=(SOCKET)lpParam;
//接收数据并保存到recvBuf变量中
char recvBuf[100];
int recv_len=-1;
while(1)
{
recv_len=recv(sockClient,recvBuf,100,0);
//recv_len=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if(recv_len>=0)
{
if (recv_len==0)
{
printf("本次接收的没有数据,是响应客户端连接信息!\n ");
}
else
{
//输出数据
recvBuf[recv_len]='\0'; //在末尾加入字符串结束符号 '\0 '
printf("%s\n",recvBuf);
printf("本次数据接收结束。\n ");
}
//recv_len=recv(sockClient,recvBuf,100,0);//recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
}
}
}

//客户端
//--------------------------------------------------------------------------------------------
#pragma once
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#include "targetver.h"
#include <tchar.h>

#include <fstream>
#include <iostream>

#include <ole2.h>
#include <conio.h>

using namespace std;

#include "string.h"

#pragma comment(lib,"WS2_32.lib")

void SendMessage(void);
int _tmain(int argc, _TCHAR* argv[])
{
SendMessage();
char q;
cin>>q;
return 0;
}

void SendMessage(void)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

//版本请求
wVersionRequested = MAKEWORD( 1, 1 );
//初始化WinSock(WSAStartup函数)
err = WSAStartup( wVersionRequested, &wsaData);
if ( err != 0 )
{  //初始化出错了退出函数
return;
}
//初始化成功!但版本不一致! 退出函数
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( ); //清除Socket
return;        //退出函数
}
//生成一个socket(sockSrv变量)
//SOCK_STREAM  用于TCP协议
//SOCK_DGRAM   用于UDP协议
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);  //使用TCP协议
//设置一个地址Socket(addrSrv变量)
SOCKADDR_IN addrSrv;
memset(&addrSrv,0,sizeof(addrSrv));
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.232");//要访问的IP地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);                 //端口6000
//绑定函数(指定本地IP地址所使用的端口号时候使用)
//(把sockSrv变量与addrSrv变量绑定在一起)
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(connect(sockSrv, (sockaddr*)&addrSrv,sizeof( addrSrv ) ) != SOCKET_ERROR )
{
int i=0;
char strch[]={ "Client send OK!(from   Client) "};
while(true)
{
//strch[strlen(strch)]=i;
if(send(sockSrv,strch,strlen(strch),0)==SOCKET_ERROR)
{
printf("WSAGetLastError:   %d\n ",WSAGetLastError());
}
else
{
printf(strch);printf("\n");
}
Sleep(300);
}
}
else
{
printf("没连上!\n");
}

//关闭Socket变量sockSrv
closesocket(sockSrv);
//清除Socket
WSACleanup();
printf("已退出SendMessage函数!\n");
}

-----the----end-----
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐