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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 17063|回复: 2
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
/ F& G9 ?* S! w' c4 O我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
7 w+ w8 N0 O5 A! J" O3 `Talk is cheak , show me the code.
5 D4 t& F' g" g) p: o3 z+ l$ N服务端代码:
* H" O2 M( j+ o. W" ~' m! i* p
  1. #include<stdlib.h>
    3 |: ]7 Y7 ^$ D( y1 C5 c; v: g% f
  2. #include<WinSock2.h>  v+ d8 `' ~- X7 |" O
  3. #pragma comment(lib,"ws2_32.lib")
    * d% h4 k( p4 X8 v$ ]/ I/ V  h
  4. int main(){0 Z+ ]0 h$ r6 J, @9 T. j/ b. q
  5.     WSADATA wsd;
    , Z# ~" g" [1 e
  6.     SOCKET sockServer;
    # n5 ]- E7 {( w+ ~4 A3 q+ [
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    7 b6 K/ i2 Q! r4 i) B
  8.     SOCKET sockClient;
    : k) {5 p0 S$ H. q0 O3 o, L% I( p& ^
  9.     SOCKADDR_IN clientaddr;
    7 c: @7 U( K2 C* v( ~
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口3 n, f. O. P6 ~6 S5 l
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket  _( }/ g& y. B* r1 l$ N/ O1 r7 R
  12. * X" X, p4 d1 j/ G- c

  13. 4 Z; U) s2 f" h4 B# w- C( K! D
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){; ?4 a7 S/ G& v
  15.         printf("Socket has been created :%d", sockServer);
    3 ~$ L  c: A4 ]( j
  16.     }- o$ C. J& y& @( ^* x; |
  17.     else{3 D0 @0 d2 q. G' ]7 [
  18.         printf("Socket create failed.");' v7 B: z% n4 W. T/ K" v
  19.         exit(0);3 @" F9 N; A. b& ?) V
  20.     }8 M; S( V) D# c5 b# x+ ~& p. f- c
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    5 |; M7 z6 k* a2 [( G
  22.     serveraddr.sin_family = AF_INET;0 n6 x/ g) X- w  u
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    * W) ~8 v- A8 _* u; X
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));# O# P& s3 D. K- ^7 @: b
  25.     char recvBuf[100];
    . i: y! v+ h: g" K1 W7 b" c
  26.     int len = sizeof(SOCKADDR);
    5 b0 Y; ^5 a# a7 \5 l5 v% k
  27.     listen(sockServer, 5);//5为等待连接数" S4 e$ \+ B$ [
  28.     while (1){+ d, e* Z8 v  V$ n7 E. B6 Z
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ) Z, p1 ]1 d( s* g: c
  30.         //接收客户端数据7 O6 K+ v' {, l
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ' ^  i8 N* M- I2 h1 C
  32.         printf("to me:%s\n",recvBuf);
    8 L1 R& v1 D: p+ }, l
  33.         memset(recvBuf, 0, 100);7 {/ T2 L1 a" p; T
  34.     }0 j/ w2 P  e. h7 F: d" x0 `
  35.     closesocket(sockClient);
    2 c0 `7 y8 z6 y5 A
  36.     system("pause");
      ^2 \. n& c# z
  37.     return 0;& q+ o0 s9 j6 S+ u. \
  38. }
复制代码
客户端代码:
& o* h! E* e! R# e, M! i/ E
  1. #include<winsock2.h>& F5 n$ F- V1 K* U: o' R
  2. #include<stdio.h>
    5 [7 c4 W1 I3 \
  3. #pragma comment(lib, "ws2_32.lib")' P7 z0 T1 F& Y. ]' q" U
  4. void main()
    ( q$ Q1 W8 h! G8 Y! ~4 z- I
  5. {9 x6 u: p+ C# I) x
  6.     WSADATA wsaData;  Q3 K! e) z% e: ]; Q
  7.     SOCKET sockClient;//客户端Socket
    ) M' |8 l3 A" r4 A
  8.     SOCKADDR_IN addrServer;//服务端地址) L" q4 Y# ]! E1 v7 Z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) S4 u/ O' H8 y0 P+ o) y- K3 W
  10.     char message[20] = "HelloSocket!";5 f* G) G, N0 B3 C7 ?1 R5 K
  11.     //定义要连接的服务端地址
    3 o3 {# R# C$ g/ U+ U8 A, c
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& j3 ]) v/ @2 V6 Z/ f
  13.     addrServer.sin_family = AF_INET;
    * w# k' S- h0 i
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    2 @" \" Y- }1 l3 j" j% Z
  15.     //新建客户端socket4 N/ Y5 O; e) V3 g" M6 ]
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ; a: b- b! _9 _, J! j9 s& ^
  17.     int s = 0;
    ! E3 C" y: o9 h3 Z9 n) W9 Y
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ! M, y2 X3 z6 f3 E

  19. : s' N+ k' A: D) P
  20.     while (1){
    : V8 b1 t6 w/ a% _+ ^) ~
  21.         //发送数据
    . {/ d# j4 q; [
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ; I4 h" m0 l8 |2 {4 [. M9 U4 J
  23.         printf("to server:");
    2 J8 H, ~; \* }$ N7 N5 s3 V
  24.         scanf("%s", message);
      p7 N/ y3 V) `" f4 v  E, R- F

  25. ( ]! l- t) x- [; ]/ h+ l
  26.     }2 F' V! R$ z  r3 H) M3 V! M
  27.     //关闭socket; ~! m( j# o. f4 H* v6 z3 u" J
  28.     closesocket(sockClient);. \# `5 M) z( H6 L  G
  29.     WSACleanup();7 M2 l6 r9 u- X: x! P
  30. }
复制代码
求懂的高手来解答一下。
  s. ?* W* H* [: R8 l! {谢谢了!* y4 ^" H4 A* G3 |; Z
; P' z- J& R' j0 d* K

; Y6 ?+ o! P, p
" j1 b5 F. Q/ {0 X% X; S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为' P1 _5 F, _) N% R# L5 a3 R
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 10:10 , Processed in 0.057635 second(s), 19 queries .

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