winsock select 学习代码(2)

之前文章的改进版

服务器仅仅接受客户端发送的字符串并显示

客户端可以调节发送数目 但是不能超过64

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

// SelectServer.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include <winsock2.h>

#include <conio.h>

#pragma comment(lib,"ws2_32")

#define SOCKET_MAXCNT   64

#define THREAD_NUM      2

#define CONNECT_PORT    8773   

#define CONNECT_ADDR    "127.0.0.1"

#define DATA_BUF_SZIE   8192

typedef struct
_SOCKET_INFORMATION {

    CHAR Buffer[DATA_BUF_SZIE];

    WSABUF DataBuf;

    SOCKET Socket;

    OVERLAPPED Overlapped;

} SOCKET_INFORMATION, * LPSOCKET_INFORMATION;

DWORD   totalSockets = 0;

LPSOCKET_INFORMATION SocketArray[FD_SETSIZE];

BOOL CreateSocketInformation(SOCKET s)

{

    LPSOCKET_INFORMATION SI;

    printf("Accepted socket number %d\n", s);

    if
((SI = (LPSOCKET_INFORMATION) GlobalAlloc(GPTR,

        sizeof(SOCKET_INFORMATION))) == NULL)

    {

        printf("GlobalAlloc() failed with error %d\n", GetLastError());

        return
FALSE;

    }

    // Prepare SocketInfo structure for use.

    SI->Socket = s;

    SocketArray[totalSockets] = SI;

    totalSockets++;

    return(TRUE);

}

void
FreeSocketInformation(DWORD Index)

{

    LPSOCKET_INFORMATION SI = SocketArray[Index];

    DWORD i;

    closesocket(SI->Socket);

    printf("Closing socket number %d\n", SI->Socket);

    GlobalFree(SI);

    // Squash the socket array

    for
(i = Index; i < totalSockets; i++)

    {

        SocketArray[i] = SocketArray[i + 1];

    }

    totalSockets--;

}

int
_tmain(int
argc, _TCHAR* argv[])

{

    WSAData wsaData;

    SOCKADDR_IN InternetAddr = {0};

    FD_SET ReadSet;

    DWORD   i = 0;

    DWORD   total = 0;

    DWORD   Flags;

    DWORD   RecvBytes = 0;

    SOCKET  listenSock = INVALID_SOCKET;

    SOCKET  acceptSock = INVALID_SOCKET;

    if( WSAStartup(MAKEWORD(2,2),&wsaData) != 0 )

    {

        printf("WSAStartup error,exit\n");

        goto
SOCKET_CLEAN;

    }

    listenSock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,

        WSA_FLAG_OVERLAPPED);

    if(listenSock == INVALID_SOCKET)

    {

        printf("WSASocket error \n");

        goto
SOCKET_CLEAN;

    }

    InternetAddr.sin_family = AF_INET;

    InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    InternetAddr.sin_port = htons(CONNECT_PORT);

    if
(bind(listenSock, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr))

        == SOCKET_ERROR)

    {

        printf("bind() failed with error %d\n", WSAGetLastError());

        goto
SOCKET_CLEAN;

    }

    if
(listen(listenSock, 5))

    {

        printf("listen() failed with error %d\n", WSAGetLastError());

        goto
SOCKET_CLEAN;

    }

    // Change the socket mode on the listening socket from blocking to

    // non-block so the application will not block waiting for requests.

    ULONG NonBlock = 1;

    if
(ioctlsocket(listenSock, FIONBIO, &NonBlock) == SOCKET_ERROR)

    {

        printf("ioctlsocket() failed with error %d\n", WSAGetLastError());

        goto
SOCKET_CLEAN;

    }

    while(1)

    {

        FD_ZERO(&ReadSet); 

        FD_SET(listenSock, &ReadSet);

        for
(i = 0; i < totalSockets; i++)

        {

            FD_SET(SocketArray[i]->Socket, &ReadSet);

        }

        total = select(0,&ReadSet,NULL,NULL,NULL);

        if(total == SOCKET_ERROR)

        {

            printf("select() failed with error %d\n", WSAGetLastError());

            goto
SOCKET_CLEAN;

        }

        if(FD_ISSET(listenSock,&ReadSet))

        {

            total--;

            acceptSock = accept(listenSock,NULL,NULL);

            if(acceptSock == INVALID_SOCKET)

            {

                if
(WSAGetLastError() != WSAEWOULDBLOCK)

                {

                    printf("accept() failed with error %d\n", WSAGetLastError());

                    goto
SOCKET_CLEAN;

                }

            }else

            {

                NonBlock = 1;

                int
ret = ioctlsocket(acceptSock,FIONBIO, &NonBlock);

                if(ret == SOCKET_ERROR)

                {

                    printf("ioctlsocket() failed with error %d\n", WSAGetLastError());

                    goto
SOCKET_CLEAN;

                }

                if
(CreateSocketInformation(acceptSock) == FALSE)

                    goto
SOCKET_CLEAN;

            }

        }

        for
(i = 0; total > 0 && i < totalSockets; i++)

        {

            LPSOCKET_INFORMATION SocketInfo = SocketArray[i];

            SocketInfo->DataBuf.buf = SocketInfo->Buffer;

            SocketInfo->DataBuf.len = DATA_BUF_SZIE;

            if(FD_ISSET(SocketInfo->Socket,&ReadSet))

            {

                total--;

                Flags = 0;

                ZeroMemory(SocketInfo->Buffer,DATA_BUF_SZIE);

                if
(WSARecv(SocketInfo->Socket, &(SocketInfo->DataBuf), 1, &RecvBytes,

                    &Flags, NULL, NULL) == SOCKET_ERROR)

                {

                    if
(WSAGetLastError() != WSAEWOULDBLOCK)

                    {

                        printf("WSARecv() failed with error %d\n", WSAGetLastError());

                        FreeSocketInformation(i);

                    }

                    continue;

                }else

                {

                    printf(SocketInfo->Buffer);

                    if(RecvBytes == 0)

                    {

                        FreeSocketInformation(i);

                        continue;

                    }

                }

            }

        }

    }

SOCKET_CLEAN:

    if(listenSock != INVALID_SOCKET)

    {

        closesocket(listenSock);

        listenSock = INVALID_SOCKET;

    }

    if(acceptSock != INVALID_SOCKET)

    {

        closesocket(acceptSock);

        acceptSock = INVALID_SOCKET;

    }

    WSACleanup();

    return
0;

}

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

// CommonClient.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include <winsock2.h>

#include <conio.h>

#pragma comment(lib,"ws2_32")

#define SOCKET_MAXCNT   64

#define THREAD_NUM      22

#define CONNECT_PORT    8773   

#define CONNECT_ADDR    "127.0.0.1"

DWORD WINAPI SocketFunc(LPVOID pM)

{

    char
buf[512] = {0}; 

    SOCKET  sock;

    int
result;

    struct
sockaddr_in cli_addr;

    int
num = *(int*)pM;

    sock = socket(AF_INET,SOCK_STREAM,0);

    cli_addr.sin_family = AF_INET;

    cli_addr.sin_port = htons(CONNECT_PORT);

    cli_addr.sin_addr.s_addr = inet_addr(CONNECT_ADDR);

    result = connect(sock,(struct
sockaddr*)&cli_addr,sizeof(cli_addr));

    if(result == SOCKET_ERROR)

    {

        printf("%d thread: connect error\n",num);

        exit(1);

    }

    while(1)

    {

        sprintf(buf,"%d thread: %s",num,"hello world!\n");

        printf(buf);

        result = send(sock,buf,100,0);

        if(result == SOCKET_ERROR)

        {

            printf("%d error \n",num);

            return
0;

        }

        Sleep(3000);

    }

    exit(1);

    return
0;

}

int
_tmain(int
argc, _TCHAR* argv[])

{

    int
num[SOCKET_MAXCNT] = {0};

    WSADATA wsa_data;

    WSAStartup(WINSOCK_VERSION,&wsa_data);

    // 初始化数组 传递给线程  区别各个线程号

    for(int
i = 0 ;i < SOCKET_MAXCNT;i++)

    {

        num[i] = i;

    }

    for(int
i = 0; i < THREAD_NUM;i++)

    {

        HANDLE hThread = CreateThread(NULL,0,SocketFunc,&num[i],0,NULL);

        if(hThread != NULL)

        {

            CloseHandle(hThread);

        }

    }

    while(1)

    {

        Sleep(100000);

    }

    return
0;

}

winsock select 学习代码(2),布布扣,bubuko.com

时间: 2024-10-13 12:02:02

winsock select 学习代码(2)的相关文章

winsock select 学习代码(1)

// SelectCli.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <winsock2.h> #include <conio.h> #pragma comment(lib,"ws2_32") #define SOCKET_MAXCNT 64 #define THREAD_NUM 2 // 实验代码 与服务器配合 不可改变连接线程数 #define CONNECT_PORT 877

JS中模板嵌套学习(代码)

<script src="script/jquery-1.4.2.js"></script>    <script src="script/jsrender.js"></script>    <script id="header" type="text/x-jsrender">        <tr>               <th>序号&

不要学习代码,要学会思考(转)

英文原文:Don't learn to code, learn to think 译/赖信涛 这是一个人人都在学习编程的时代:Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo’s在各个国家悄然兴起:在英国,编程已经是各个年级学生的正式课程. 我认为这里有个误区.别误会我——如果每个人都会一些编程知识,这个世界当然会变得更好——但是学会写代码不应该是我们的目标.计算机和程序只是一个工具,是一种达到某种目的的方法. 真正的目标应该

我自己的一个令人警醒的学习代码的故事

-- 一个正常理智的人是如何抓狂的 我本来是个穿正装坐办公室的人.但当我有了个模糊的创业灵感的时候,我决定自己学习编程. 我听说过一个家伙吹牛说使用一门叫做Ruby的语言是如何方便快捷令自己的工作流程自动化的.我想,那就学Ruby吧.于是我回到家开始google.15秒钟过后,我开始研究Ruby的教程了. 一周之后,我第一次参加黑客聚会.每个人都在讨论向Scala,Clojure和Go这样的编程语言.有很多需要学习的东西.我借了三本O'relly出版的专业书籍,每本读了50页. 我的一个朋友告诉

资深PM告诉你为什么产品经理应该学习代码编程

大家都说产品经理不需要懂太多编程技术,不用太刻意学习编程知识,真的是这样么?今天和大家分享的是产品经理应该学习代码编程,为什么呢?一起来看看吧. 对于一个产品汪来说,创造产品是一件令人兴奋的事情(程序喵.设计狮按住了刀片....).产品经理们可以将自己天马行空的idea与在团队友(diang)好(guang).和(huo)谐(shi)的沟通之后转换为实实在在的产品.或者至少是制作出一个版本,然后发送给全世界. 每一天我都对我的工作所带来的创造性而备受鼓舞.而从零开始规划一个产品又往往会带来一系列

不仅学习代码,也要学会思考

这是一个人人都在学习编程的时代: [合肥开源IT教育][开源培训][php培训][开源教育][开源IT教育培训][合肥php培训]Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo’s在各个国家悄然兴起:在英国,编程已经是各个年级学生的正式课程.我认为这里有个误区.别误会我——如果每个人都会一些编程知识,这个世界当然会变得更好——但是学会写代码不应该是我们的目标.计算机和程序只是一个工具,是一种达到某种目的的方法.真正的目标应该

程序员都应学习代码编译器知识

程序员都应学习代码编译器知识   所有优秀的计算机科学学院都提供了编译器课程,但是相对比较少的学校把它作为本科课程的必修部分.这篇文章回答了这个问题:为什么需要学习编译器知识?即使你从没打算过编写编译器. 我写这篇文章的其中一个原因是,尽管我在读本科时很喜欢编译器课程,但是我几乎看不到它的实际作用.大多数资料看起来要么简单易懂,要么很深奥(事实上,我找到的大部分编译器资料都是很枯燥的.)无论怎样,我用了几年时间总结了为什么这类课程会如此有用的实际原因.原因如下. 分析器和解析器无处不在 严谨的p

不要学习代码,要学会思考《IT蓝豹》

这是一个人人都在学习编程的时代:Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo's在各个国家悄然兴起:在英国,编 程已经是各个年级学生的正式课程. 我认为这里有个误区.别误会我--如果每个人都会一些编程知识,这个世界当然会变得更好--但是学会写代码不应该是我们的目标.计算机和程序只是一个工具,是一种达到某种目的的 方法. 真正的目标应该是学会思考的方式.换句话说,我们应该尝试教授计算机科学,而不是教着写代码.在本文中,我将介

不要只为学习代码,要学会思考

这是一个人人都在学习编程的时代:Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo's在各个国家悄然兴起:在英国,编程已经是各个年级学生的正式课程. 我认为这里有个误区.别误会我--如果每个人都会一些编程知识,这个世界当然会变得更好--但是学会写代码不应该是我们的目标.计算机和程序只是一个工具,是一种达到某种目的的方法. 真正的目标应该是学会思考的方式.换句话说,我们应该尝试教授计算机科学,而不是教着写代码.在本文中,我将介绍两