⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test1.c

📁 服务器和客户端通信1111111111111111111111111111
💻 C
字号:
// UDP_Winsock_API_Server_5000.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#include <winsock.h>
//#include <Winbase.h>

#define socklen_t	int
#pragma comment(lib, "wsock32.lib")

DWORD WINAPI thread(LPVOID p);
struct sockaddr_in serv;
int addlen,s=1;
char buff[100];
SOCKET sock;
struct sockaddr_in * from;
//	struct sockaddr* from = (struct sockaddr*)malloc(sizeof(struct sockaddr)) ;
int fromlen=100; //= ( int*)malloc(sizeof(int));
fd_set* readfds, *writefds, *exceptfds;


int main(int argc, char* argv[])
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
		HANDLE  ThreadID;	// 线程id
//		int  ThreadID;	// 线程id
		DWORD TlsIndex;
 
	wVersionRequested = MAKEWORD( 2, 2 );
 
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
	    /* Tell the user that we could not find a usable */
	    /* WinSock DLL.                                  */
	    return 1;
	}
 
	/* Confirm that the WinSock DLL supports 2.2.*/
	/* Note that if the DLL supports versions greater    */
	/* than 2.2 in addition to 2.2, it will still return */
	/* 2.2 in wVersion since that is the version we      */
	/* requested.                                        */
 
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
	        HIBYTE( wsaData.wVersion ) != 2 ) {
	    /* Tell the user that we could not find a usable */
	    /* WinSock DLL.                                  */
	    WSACleanup( );
	    return 1; 
	}
 
	/* The WinSock DLL is acceptable. Proceed. */
	 from = (struct sockaddr_in*)malloc(sizeof(struct sockaddr_in)) ;
	sock=socket(AF_INET,SOCK_DGRAM,0);
	serv.sin_addr.s_addr=htonl(INADDR_ANY);
//	serv.sin_addr.s_addr=inet_addr("127.0.0.1");
	serv.sin_family=AF_INET;
	serv.sin_port=3000;//htons(5000);
	addlen=sizeof(serv);
	readfds= (fd_set*)malloc(sizeof(fd_set));
	writefds= (fd_set*)malloc(sizeof(fd_set));
	exceptfds= (fd_set*)malloc(sizeof(fd_set));
	readfds->fd_array[0]=sock;
	readfds->fd_count=1;
	writefds->fd_array[0]=sock;
	writefds->fd_count=1;
	exceptfds->fd_array[0]=sock;
	exceptfds->fd_count=1;
//	FD_SET(sock, readfds); 
//	FD_SET(sock, writefds); 
//	FD_SET(sock, exceptfds); 
	if (bind(sock,(struct sockaddr*)&serv,addlen))
	{
		printf("\n绑定错误:%d\n",WSAGetLastError());
	}
	else
	{
		printf("\n服务器创建成功\n");
		//启动响应线程
//		AfxBeginThread(&thread,0);
	    TlsIndex = TlsAlloc();
    if (TlsIndex == 0xFFFFFFFF) {
        printf( "\nUnable to allocated thread local storage.\n" );
        exit( 1 );
        }
	printf("调用createthread创建线程\n");
	//调用createthread创建线程
		CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, /*(void *)this*/&serv, 0,NULL);
//		ThreadID = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, /*(void *)this*/NULL, 0,(LPDWORD)&thread);
//		ThreadID = ThreadID ? 0 : 1;	// 如果成功,则返回为0
	printf("调用createthread创建线程完毕\n");		
		if(ThreadID=NULL)	// ThreadID如果不为0,则线程创建失败
		{
			printf("线程创建失败\n");
			return FALSE;
		}
	else
			printf("线程创建成功\n");
//		return true;

//		sendto(sock,buff,100,0, (struct sockaddr *)from,  fromlen);
	}
//	closesocket(sock);
//	scanf("%s",buff);
	getch();
	return 0;
}

DWORD WINAPI thread(LPVOID p)
{
	printf("线程成功\n");
//	while(1);	
	//开始侦听	
		while(s>0)
			{
				//s=recv(sock,buff,100,0);
				//if(select(  0,  readfds,  writefds,  exceptfds, NULL)==SOCKET_ERROR)
//				if(select(  0,  readfds,  NULL,  exceptfds, NULL)==SOCKET_ERROR)
//					printf("\nselect错误:%d  s=%d\n",WSAGetLastError(),s);
				if((s=recvfrom(sock,buff,100,0, (struct sockaddr *)from, &fromlen))<0)
				{
					printf("\nrecvfrom错误:%d  s=%d  in:%s\n",WSAGetLastError(),s,buff);
					printf("\fromlen=%d,from%s",fromlen,inet_ntoa(from->sin_addr));
				}
				else
				{
					printf("\nfrom%s:  port=%d:  say:%s",inet_ntoa(from->sin_addr),from->sin_port,buff);
					if(sendto(sock,buff,100,0, (struct sockaddr *)from,  fromlen)<0)
						printf("\nsendto错误:%d  s=%d  in:%s\n",WSAGetLastError(),s,buff);
					else
						printf("\nsend success!\n");
				}
			}

  
/*	char buff[100];
	CSize size;
	size.cx=0;
	size.cy=30;
	int s=1,msgcount,loop=1,flag=0;
	CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
	//获得客户端数量
	msgcount=dlg->getcount();
	if (msgcount==-1)
		loop=0;
	if(loop)
	{
		s=1;
		//调用accept()函数,直到收到一个客户端连接,并将其连接到dlg->msgsock[msgcount]
		dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
		if (dlg->msgsock[msgcount]==INVALID_SOCKET)
		{
			dlg->m_edit.SetWindowText("Error accept");
		}
		else
		{
			//启动线程,以接受下一个客户端连接
			AfxBeginThread(thread,0);
			dlg->SetForegroundWindow();
			dlg->m_list.InsertItem(dlg->count++,"连接成功");
			dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
			dlg->m_list.Scroll(size);
			dlg->m_button.EnableWindow(TRUE);		
			while(s!=SOCKET_ERROR)
			{
				//循环接收数据
				s=recv(dlg->msgsock[msgcount],buff,100,0);
				dlg->SetForegroundWindow();
				if (s!=SOCKET_ERROR)
				{
					dlg->m_list.InsertItem(dlg->count++,buff);
					dlg->m_list.Scroll(size);
					dlg->sendtoall(dlg->msgsock[msgcount],buff);
				}
			}

			send(dlg->msgsock[msgcount],"Disconnected",100,0);
			dlg->m_list.InsertItem(dlg->count++,"Disconnected");
			dlg->m_list.Scroll(size);
			dlg->msgsock[msgcount]=NULL;
			for (int i=0;i<50;i++)
				if (dlg->msgsock[i]!=NULL)
					flag=1;
			if (flag!=1)
				dlg->m_button.EnableWindow(FALSE);
			closesocket(dlg->msgsock[msgcount]);
		
		}
	}
*/
	//终止线程
//	AfxEndThread(0);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -