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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。0 D# m  |) f) A
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。+ d7 |1 b- j5 y7 W# c. l
Talk is cheak , show me the code.
# C, g! Q/ a' W8 R0 W服务端代码:
. Z6 W, g! J) r8 E* ?, W9 w# _3 s
  1. #include<stdlib.h>
    6 @: a: W4 u8 d9 f
  2. #include<WinSock2.h>  @- ^! _& B! n6 q- w* D. u5 |4 x
  3. #pragma comment(lib,"ws2_32.lib")/ H% \; N" h9 A5 p, a: n' u/ Q
  4. int main(){
    * G( R5 h2 ]9 g% J5 U% z6 Q4 n5 d
  5.     WSADATA wsd;
    * B  n- ^# [- |1 D
  6.     SOCKET sockServer;. b2 b6 L* Z* Q. Q' G# V/ j7 E
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号$ {# S; h. {! A2 u
  8.     SOCKET sockClient;
    ) C  s9 Q# V# E2 c
  9.     SOCKADDR_IN clientaddr;
    , G6 e% H& T' h( _% `
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口% t, g; L$ D% b7 r
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: r9 Z# w. Z$ u
  12. 5 e/ V# c) s- o
  13. 5 ]( i6 m8 K$ w, u" |0 l
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    3 G* q1 m$ P; J$ n! z% H* e
  15.         printf("Socket has been created :%d", sockServer);
    8 j! d. C. _- P7 ^; i. H1 r+ Q3 ]' g* L
  16.     }
    4 }0 A; r7 D( ^, q% C9 o) ]/ T
  17.     else{% m1 H2 ^# d+ }2 ^
  18.         printf("Socket create failed.");4 Q; w& p" J3 ~
  19.         exit(0);
    ) S; T9 D1 O5 M9 p- q+ P' p- |
  20.     }
    4 z7 Q- M. z7 Q1 J$ V  _
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);+ G# d2 V5 Z( S  J& E6 i
  22.     serveraddr.sin_family = AF_INET;5 J" E6 O5 T! z- `* U# R0 g
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000( H/ s6 T& V! v3 Q; n; j
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    8 ^' k: h0 g' X" I: w( p
  25.     char recvBuf[100];. {5 D; B! Y. a- y2 Z
  26.     int len = sizeof(SOCKADDR);( _/ b4 f, w# ~% M' Y
  27.     listen(sockServer, 5);//5为等待连接数
    + j3 Y/ I7 p6 S- m. ^
  28.     while (1){" z3 M; M) E) q4 |
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);/ }1 Z3 E5 c& L7 P- M5 ?( q
  30.         //接收客户端数据9 L% G2 o* d' h/ _5 y0 V
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);6 w4 N" |" l9 Q
  32.         printf("to me:%s\n",recvBuf);- Y' R5 }8 }5 @5 ?1 {
  33.         memset(recvBuf, 0, 100);
    ( ^3 h6 i3 P5 P4 P' d. l2 y
  34.     }) Y; U2 [( u9 l- C4 E  F2 w6 S
  35.     closesocket(sockClient);. d- T8 K8 J6 i" M" B! m
  36.     system("pause");, r% N. A  m) b  b! z! k
  37.     return 0;
    ) j8 W# N: @0 A* f
  38. }
复制代码
客户端代码:
1 e& c. j% F. ~  j1 B, B. W
  1. #include<winsock2.h>% Y2 a' q1 _) S5 E5 v/ Q$ f' P+ y* {
  2. #include<stdio.h>6 b6 r3 p. S2 J! A
  3. #pragma comment(lib, "ws2_32.lib")& b3 ]# t0 N2 d5 y; Q
  4. void main()5 Z( [0 ^; x. T& a
  5. {7 t: P3 W( Z( p* U% L- m: I
  6.     WSADATA wsaData;
    - o! N7 t2 m( F3 [- w
  7.     SOCKET sockClient;//客户端Socket5 q0 O( r  I5 X" M$ _
  8.     SOCKADDR_IN addrServer;//服务端地址
    2 `5 w. k3 D$ X* T5 |
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    8 M' W; {8 C3 g5 f9 d2 w
  10.     char message[20] = "HelloSocket!";
    1 q6 e/ A9 c) K4 M
  11.     //定义要连接的服务端地址: X! i& |1 \5 _
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    & ]: f3 M, L# T1 R. r. O9 l
  13.     addrServer.sin_family = AF_INET;! I. J& j. o9 P& ^5 X, G) s; ^
  14.     addrServer.sin_port = htons(6000);//连接端口60004 t- d  R) A- a& ^9 ~
  15.     //新建客户端socket
    1 U! \2 p! P; C; l1 W) ~2 c
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);8 r" b6 a' I+ B: M9 \5 B; M
  17.     int s = 0;
    ; }, q" x9 z. V. Y6 {" t
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ( l% W8 z4 ?+ f3 O1 D

  19. + }: `$ ^) O  [! Q
  20.     while (1){5 W. ~) S. a. z* B+ |
  21.         //发送数据
    ' z7 W% h8 f2 C3 Y* Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    : n/ L7 E1 C6 Y; e& W( B, U  z
  23.         printf("to server:");/ k$ B, ^7 _( a( R3 ?
  24.         scanf("%s", message);+ _* G, c4 V: T) C

  25. $ b6 C& I: u0 ~0 O& N( b2 h
  26.     }
    ; R3 R4 _6 v+ m" q3 R
  27.     //关闭socket* q* t: z4 w# A5 w  J( K
  28.     closesocket(sockClient);- V+ e- c/ q  I+ H% V/ N% t
  29.     WSACleanup();& V% n/ D& W* ]0 T
  30. }
复制代码
求懂的高手来解答一下。! o$ }+ L$ D6 n7 N& i
谢谢了!  \+ F, z# L: w1 A) M& ]( x$ E

2 p  F+ m% t- ?* M3 g1 }7 W. A; E( ^+ ?- a0 W5 t0 ~) x

* ?# X6 \( q* `& M( k  J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为3 k# V9 p5 d$ K- ?. \: J
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 00:14 , Processed in 0.059519 second(s), 18 queries .

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