cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
2 o5 B3 W: m! T
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 t5 f/ S. t' U! b
Talk is cheak , show me the code.
+ D( N' v) x9 J( {3 t$ A
服务端代码:
& I% V* @$ [( i3 |
#include<stdlib.h>
, C1 H$ X- U- s0 V
#include<WinSock2.h>
; ]3 R% n; w+ @% @7 T
#pragma comment(lib,"ws2_32.lib")
M& {6 ~& n9 K6 _
int main(){
9 s$ m' r& @% t; o! t$ H# m( g) b
WSADATA wsd;
$ D2 \2 |, A* P! B1 X
SOCKET sockServer;
1 x* Y( V5 S: u" f# N1 A$ w; R) M* U! G, Z
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
6 h, ]9 n2 j0 Z" Q
SOCKET sockClient;
4 @& ]+ y: M0 I9 w9 I5 A: r3 z H
SOCKADDR_IN clientaddr;
, `! e4 g3 w# R
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
6 L, n3 X" V7 w! c8 g
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
2 G, @4 F' }2 `1 I3 I: A, l- P
$ [* r6 g! b3 i' O
* C2 u' ^- k7 J( r' `
if (sockServer != -1 && sockServer != INVALID_SOCKET){
$ N1 z5 F. x5 r& F
printf("Socket has been created :%d", sockServer);
* ^+ t, Q# u0 v( r
}
, ?/ L" A- i( b3 ~* U0 h! f2 W- t
else{
2 d: j F8 j/ h
printf("Socket create failed.");
7 N2 ^7 Q5 S8 A$ d
exit(0);
9 E# x( X' e- y- ^5 H
}
4 ~, w0 f1 b r+ _7 w* @9 H) s
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
7 U5 k+ L- A5 [0 i; Z" t% {
serveraddr.sin_family = AF_INET;
' K; I# h5 Z3 |: j. X7 W l
serveraddr.sin_port = htons(6000);//绑定端口6000
' x ^- [6 }5 ?6 P9 j
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
& |# R2 \- D' E% `4 Z" W [& L
char recvBuf[100];
, O' w0 G" U; V( t- F
int len = sizeof(SOCKADDR);
) Q2 x+ b$ \: s1 j5 u+ S2 e$ b
listen(sockServer, 5);//5为等待连接数
9 n# e8 |( u+ ?8 T
while (1){
6 J* \+ r$ d$ T4 i: p! h
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
/ P2 u& C8 q6 b4 N2 u% ?0 e: O: E
//接收客户端数据
1 J8 j9 T( Q1 `- y) k" e: m+ U) Y
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
% L4 i1 l+ ?, i& N" Z8 Y
printf("to me:%s\n",recvBuf);
( h/ e( L% t5 W9 d: ~
memset(recvBuf, 0, 100);
& ~3 j+ B4 E: f0 y( N6 q: q
}
, g$ k1 e# b9 ^8 O. c2 U
closesocket(sockClient);
& M8 z3 X+ J9 M8 [' a' D5 T
system("pause");
7 v/ `8 h5 ]" I
return 0;
+ a% w2 f4 G' g& W( t$ W# y
}
复制代码
客户端代码:
. D7 x% d: V7 W, ?% d9 M; q
#include<winsock2.h>
, @& d3 P2 F6 i8 w8 \
#include<stdio.h>
9 [: z* E* ?1 E4 I, _. r
#pragma comment(lib, "ws2_32.lib")
; Z- k3 R H: Q) L. O
void main()
1 K: N) Z- m7 M. j! Q9 y4 I: Y
{
; Q" A( p* q+ P$ T+ c1 \# T
WSADATA wsaData;
1 t- p: C* W. {8 P8 b& }
SOCKET sockClient;//客户端Socket
) i, K$ c# x( F! G
SOCKADDR_IN addrServer;//服务端地址
8 c6 ?" I7 o2 k, ~- x+ H- _# ]' f
WSAStartup(MAKEWORD(2, 2), &wsaData);
9 e d! g4 a: d D4 P
char message[20] = "HelloSocket!";
6 T! A0 F0 |$ z- o. t0 f9 F
//定义要连接的服务端地址
* U. p2 G7 a0 E S- |2 {
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
: r$ z7 }. b, Y2 s$ ]% c
addrServer.sin_family = AF_INET;
" ]* K0 O5 v, @" a
addrServer.sin_port = htons(6000);//连接端口6000
2 Z+ \- L& T9 x0 Y! R; `
//新建客户端socket
. m; l, H# W* `* Q. w& ^5 E1 }
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
3 P' ?# L) U8 b# w+ L6 H
int s = 0;
* o5 T0 a" s" a: x: K1 k
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
, E/ p1 q8 N' { [6 m9 i6 @( D
2 j |: t+ {! A! I1 x+ q$ p4 v+ {
while (1){
; T+ p. }$ [# K9 H3 Y" A1 ^' K4 ?
//发送数据
' R5 _6 M: C4 a& f; u+ P
int a = send(sockClient, message, strlen(message) + 1, 0);
6 ~2 [; J8 U& p5 I$ i% _2 Q8 ~
printf("to server:");
. V% \0 I3 r o6 I# \5 Y
scanf("%s", message);
0 E" w' x) B. Y: b+ W
" V0 n2 F$ P6 P# ~1 D
}
2 G4 e: v. n) @+ m0 t8 w
//关闭socket
. v3 F, v/ h2 K( }/ v
closesocket(sockClient);
; }3 K2 c0 ]: q
WSACleanup();
# r* y& {: Z$ r& T2 G2 b1 Z
}
复制代码
求懂的高手来解答一下。
* C/ n! J# J7 q% a
谢谢了!
1 E: \7 L L: R8 S1 u
2 X7 J! I2 L* I6 {
2 }4 _* k# b& L. E
o( ]1 A' H1 z8 N0 a
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
" p$ S; E/ \) R3 D8 h1 _
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2