📄 test1.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 + -