C语言编写的仿QQ局域网通讯程序

更新时间:2023-11-11 01:41:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

// 系统添加网络连接的头文件引用及一些消息类型的宏定义:

#include #include

#pragma comment(lib,\

#define CLIENTSEND_EXIT 1 #define CLIENTSEND_TRAN 2 #define CLIENTSEND_LIST 3

#define SERVERSEND_SELFID 1 #define SERVERSEND_NEWUSR 2 #define SERVERSEND_SHOWMSG 3 #define SERVERSEND_ONLINE 4

FILE *ioutfileServer; FILE *ioutfileClient;

struct CReceivePackage {

int iType; int iToID; int IFromID;

char cBuffer[1024]; };

struct CSendPackage {

int iType; int iCurConn;

char cBuffer[1024]; };

struct CUserSocketInfo {

int ID;

char cDstIP[64]; int iPort;

SOCKET sUserSocket; };

struct CUser {

int ID;

char cDstIP[64]; };

struct CUser usr[20]; int bSend=0; int iMyself; int iNew=0;

struct CUserSocketInfo usrinfo[20];

//退出函数

void ExitSystem() {

if(ioutfileServer!=NULL) fclose(ioutfileServer); if(ioutfileClient!=NULL) fclose(ioutfileClient); WSACleanup(); exit(0); }

//服务器端接收消息的线程

DWORD WINAPI threadproServer(LPVOID pParam) {

SOCKET hsock=(SOCKET)pParam; char cRecvBuffer[1024]; char cShowBuffer[1024]; int num=0;

if(hsock!=INVALID_SOCKET) printf(\while(1) {

num=recv(hsock,cRecvBuffer,1024,0); if(num>=0) {

cRecvBuffer[num]='\\0';

sprintf(cShowBuffer,\printf(\

fwrite(cShowBuffer,sizeof(char),strlen(cShowBuffer),ioutfileServer); fflush(ioutfileServer);

if(strcmp(\{

ExitSystem(); }

} }

return 0; }

//检查IP

int CheckIP(char *cIP) {

char IPAddress[128]; char IPNumber[4]; int iSubIP=0; int iDot=0; int iResult=0; int iIPResult=1; int i;

memset(IPNumber,0,4);

strncpy(IPAddress,cIP,128); for(i=0;i<128;i++) {

if(IPAddress[i]=='.') {

iDot++; iSubIP=0;

if(atoi(IPNumber)>255) iIPResult=0;

memset(IPNumber,0,4);

} else {

IPNumber[iSubIP++]=IPAddress[i]; }

if(iDot==3 && iIPResult!=0) iResult=1; }

return iResult; }

//创建点对点服务端

void CreateServer() {

SOCKET m_SockServer;

struct sockaddr_in serveraddr;

struct sockaddr_in serveraddrfrom;

int iPort=4600; int iBindResult=-1; int iWhileCount=200;

struct hostent* localHost; char* localIP;

SOCKET m_Server;

char cWelcomBuffer[]=\int len=sizeof(struct sockaddr); int iWhileListenCount=10;

DWORD nThreadId=0; int ires;

char cSendBuffer[1024]; char cShowBuffer[1024];

ioutfileServer=fopen(\

m_SockServer=socket(AF_INET,SOCK_STREAM, 0); printf(\本机绑定的端口号(大于1024):\scanf(\

localHost=gethostbyname(\

localIP=inet_ntoa(*(struct in_addr *)*localHost->h_addr_list);

serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(iPort);

serveraddr.sin_addr.S_un.S_addr=inet_addr(localIP);

iBindResult=bind(m_SockServer,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr));

while(iBindResult!=0 && iWhileCount>0) {

printf(\绑定失败,重新输入:\scanf(\

serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(iPort);

serveraddr.sin_addr.S_un.S_addr=inet_addr(localIP);

iBindResult=bind(m_SockServer,(struct sockaddr*)&serveraddr,sizeof(struct

sockaddr)); iWhileCount--; if(iWhileCount<=0) {

printf(\端口绑定失败,重新运行程序\\n\exit(0); } }

while(iWhileListenCount>0) {

printf(\listen(m_SockServer,0);

m_Server=accept(m_SockServer,(struct sockaddr*)&serveraddrfrom,&len); if(m_Server!=INVALID_SOCKET) {

send(m_Server,cWelcomBuffer,sizeof(cWelcomBuffer),0);

CreateThread(NULL,0,threadproServer,(LPVOID)m_Server,0,&nThreadId); break; }

printf(\

iWhileListenCount--; if(iWhileListenCount<=0) {

printf(\建立连接失败\\n\exit(0); } }

while(1) {

memset(cSendBuffer,0,1024); scanf(\if(strlen(cSendBuffer)>0) {

ires=send(m_Server,cSendBuffer,strlen(cSendBuffer),0); if(ires<0) {

printf(\发送失败\} else {

sprintf(cShowBuffer,\printf(\

fwrite(cShowBuffer,sizeof(char),strlen(cShowBuffer),ioutfileServer);

}

if(strcmp(\{

ExitSystem(); } } } }

//客服端接收消息的线程

DWORD WINAPI threadproClient(LPVOID pParam) {

SOCKET hsock=(SOCKET)pParam ; char cRecvBuffer[1024]; char cShowBuffer[1024]; int num=0;

if(hsock!=INVALID_SOCKET) printf(\while(1) {

num=recv(hsock,cRecvBuffer,1024,0); if(num>=0) {

cRecvBuffer[num]='\\0';

sprintf(cShowBuffer,\printf(\

fwrite(cShowBuffer,sizeof(char),strlen(cShowBuffer),ioutfileClient); fflush(ioutfileClient);

if(strcmp(\{

ExitSystem(); } } }

return 0; }

//创建点对点客服端

void CreateClient() {

SOCKET m_SockClient;

struct sockaddr_in clientaddr; char cServerIP[128]; int iWhileIP=10; int iCnnRes;

DWORD nThreadId=0;

char cSendBuffer[1024]; char cShowBuffer[1024]; char cRecvBuffer[1024]; int num; int ires; int iIPRes;

m_SockClient=socket(AF_INET,SOCK_STREAM,0); printf(\请输入服务器地址\ scanf(\

if(strlen(cServerIP)==0)

strcpy(cServerIP,\ else {

iIPRes=CheckIP(cServerIP); while(!iIPRes && iWhileIP>0) {

printf(\请重新输入服务器地址:\\n\ scanf(\ iWhileIP--; if(iWhileIP<=0) {

printf(\输入次数过多\\n\ exit(0); } } }

ioutfileClient=fopen(\ clientaddr.sin_family=AF_INET; clientaddr.sin_port=htons(4600);

clientaddr.sin_addr.S_un.S_addr=inet_addr(cServerIP); iCnnRes=connect(m_SockClient,(struct sockaddr*)&clientaddr,sizeof(struct sockaddr)); if(iCnnRes==0) {

num=recv(m_SockClient,cRecvBuffer,1024,0);

if(num>0) {

printf(\

CreateThread(NULL,0,threadproClient,(LPVOID)m_SockClient,0,&nThreadId); }

while(1) {

memset(cSendBuffer,0,1024); scanf(\ if(strlen(cSendBuffer)>0) {

ires=send(m_SockClient,cSendBuffer,strlen(cSendBuffer),0); if(ires<0) {

printf(\发送失败\\n\ } else {

sprintf(cShowBuffer,\to :%s\\n\

printf(\

fwrite(cShowBuffer,sizeof(char),strlen(cShowBuffer),ioutfileClient);

fflush(ioutfileClient); }

if(strcmp(\ {

ExitSystem();

} } } }//iCnnRes else {

printf(\连接不正确\\n\ } }

//网络通信系统主函数

int main(void) {

int iSel=0; WSADATA wsd;

WSAStartup(MAKEWORD(2,2),&wsd); do {

printf(\选择程序类型:\\n\printf(\点对点服务端:1\\t\\t\\t\printf(\点对点客服端:2\\n\

//printf(\服务器中转服务端:3\\n\//printf(\服务器中转客服端:4\\n\scanf(\

}while(iSel<0 || iSel>2);

switch(iSel) {

case 1: CreateServer();break; case 2:CreateClient();break;

//case 3:CreateTranServer();break; //case 4:CreatTranClient();break; }

printf(\退出系统 \\n\

return 0; }

本文来源:https://www.bwwdw.com/article/170v.html

Top