您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

C语言 socket 编写简单服务端客户端通信问题

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 17053| 评论数: 2|帖子模式

大家好,感谢你的回复。
$ T- {3 w5 {  r& d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。3 e. y3 D2 ^$ c
Talk is cheak , show me the code.
" t& J7 S$ e. D' k服务端代码:" b* H( F5 A1 P* i3 h, s3 E
  1. #include<stdlib.h>
    0 b4 ^% f( G9 P/ j1 J/ s
  2. #include<WinSock2.h>! @6 L2 d% Z9 k6 Z: p0 T  F. e
  3. #pragma comment(lib,"ws2_32.lib")0 A/ F4 I- _: s- f) R. C" n
  4. int main(){
    ; e3 T( U% H- d* Z8 [
  5.     WSADATA wsd;7 O  V2 N" ^: a4 O6 h0 S% J7 i
  6.     SOCKET sockServer;5 N! p% k7 l6 B  M
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号) b6 L  y* \$ S3 [7 `  s
  8.     SOCKET sockClient;2 b1 z4 I5 n0 m4 N
  9.     SOCKADDR_IN clientaddr;
      l) m0 j  M! `9 P
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口" {# j1 K9 d8 C2 e( _' O
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    % R- A) ]( G# i4 P, m7 L! L/ W6 [
  12. 4 u9 G$ G% Z- F- T* @$ q$ y
  13. ' }6 S3 _: h7 k. V" B% A
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){- Y2 u% b5 L# d; ?) U
  15.         printf("Socket has been created :%d", sockServer);
    ! q2 \3 [/ ^* f
  16.     }
    - _  Z$ n4 W, Z5 q
  17.     else{
    / W: _; A% t0 |$ O& q# j
  18.         printf("Socket create failed.");
    0 Z9 e: x; S3 W' q5 p4 W$ p. H
  19.         exit(0);3 L1 C5 d: g- e0 }% Q
  20.     }
    8 a: V$ U8 e7 P, _0 b* O3 G. o7 c7 e8 H
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    7 v0 H7 F% F6 C. D
  22.     serveraddr.sin_family = AF_INET;: m2 \& E% [2 g* J
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    # |- K& d1 |6 P. F) h. r& `/ b
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    # w" `& R+ W- q1 N* l# d
  25.     char recvBuf[100];
    % V: s! L" _$ o' Z
  26.     int len = sizeof(SOCKADDR);
    # ~, V  `9 ~9 w: [
  27.     listen(sockServer, 5);//5为等待连接数
    ( g: c" A3 L6 A) S4 O
  28.     while (1){5 K% Z: |' Z7 M$ f' {6 x6 B
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ( W% z  Q$ J: d" [" P$ @  A( S, o
  30.         //接收客户端数据
    3 s" V0 c$ C% ?$ S+ h1 P
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);! |: p$ }% s9 m2 U7 u$ t' i
  32.         printf("to me:%s\n",recvBuf);
    9 K  N" \% N8 e1 G
  33.         memset(recvBuf, 0, 100);
    9 d: o/ A1 Y* ?  B: }* Y1 M6 ?
  34.     }; Z% k+ A. `7 H, P% Y6 U
  35.     closesocket(sockClient);1 {& i% o" K' b
  36.     system("pause");  c5 A* f# e# s9 h* x1 z) d4 c
  37.     return 0;
    , `( m7 v: q/ ]/ U. [1 L! d1 J6 T
  38. }
复制代码
客户端代码:* i& g6 ]* Z# \& ]
  1. #include<winsock2.h>& {* m: O' T! i4 o/ B
  2. #include<stdio.h>5 ^- @# S' z+ r" W: }$ d& X" m$ A
  3. #pragma comment(lib, "ws2_32.lib")# }2 f; T+ O  V* _
  4. void main()' n9 P% b/ \1 S
  5. {* }: A! b- E% L; A2 U4 U
  6.     WSADATA wsaData;. [6 w# j- j& w
  7.     SOCKET sockClient;//客户端Socket
    3 ^: M" H. R& g% M. x
  8.     SOCKADDR_IN addrServer;//服务端地址
    / Z4 O# }' u, D3 o8 P5 q) \
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);* `2 T  Q, h. e5 G$ b9 c
  10.     char message[20] = "HelloSocket!";2 n0 D  x8 l' C5 E' d
  11.     //定义要连接的服务端地址
    # M  ^$ q' |3 w6 i, f
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址), y: C% `% M9 D/ B
  13.     addrServer.sin_family = AF_INET;
    - x; Y. f4 V8 p. s0 r# T
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    3 P, _+ g; f; _+ [6 H8 ?5 Q$ X
  15.     //新建客户端socket
    ( @! D4 l3 w, Q/ O' A) R
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    . g$ l- A* z+ b- T3 e
  17.     int s = 0;# H  Z& A# Y4 Y. l
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    5 d( s6 P$ Y! E1 x6 C6 w, }

  19. 0 Q' A8 D5 ^: z; a; L
  20.     while (1){4 Y3 [1 c5 a' D* M% q9 m) g
  21.         //发送数据
    . G0 }# p1 [/ Z3 b8 h
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    6 U, U$ X- h0 m" q% O
  23.         printf("to server:");
    . q2 t. w( E. a2 W7 I4 g4 {
  24.         scanf("%s", message);- Y6 B" p4 k% u
  25. " J# J4 J" j6 m$ Z0 N+ s
  26.     }
    : `% s/ ?  G3 Y, v) S$ c
  27.     //关闭socket: [8 C- B* l4 S' _' e0 c
  28.     closesocket(sockClient);
    ( N/ i9 F/ f2 C! C3 }
  29.     WSACleanup();
    % X! F* O) C+ v' T8 y# K* C& x4 R
  30. }
复制代码
求懂的高手来解答一下。
# i  y4 p8 w7 m3 ^谢谢了!
) u6 F# ]& o; x) {) n

  S& B4 R2 v' ?$ r+ j- K# e& Q$ e. I. q. u4 |8 M. y
" g8 o' a- b0 o4 H" Y

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
- x* H2 g  N2 A" p# zrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

浏览过的版块

GMT+8, 2026-8-4 05:14 , Processed in 0.056438 second(s), 20 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!