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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。8 s5 S$ w' M$ x$ a3 R# ]
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。) g7 t6 X) b! o* \$ q7 s
Talk is cheak , show me the code., a! z6 h3 y2 o) Q5 v+ O
服务端代码:
& {; W. S" `- M% J( ^0 E# u/ O
  1. #include<stdlib.h>7 q/ Q9 N& `3 A* g# l/ y! C& O
  2. #include<WinSock2.h>: L9 i! M3 Q+ N3 r  C9 p: F
  3. #pragma comment(lib,"ws2_32.lib")) L5 c( f7 p+ |) e
  4. int main(){9 J- w; m# u1 F# P- ~( b2 v
  5.     WSADATA wsd;; F% C5 X' l2 o% g% ?
  6.     SOCKET sockServer;$ t: e$ N* @- ~) P8 d$ ~+ |
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    . P" Z) V' ]. `0 U* A
  8.     SOCKET sockClient;0 g( \; ^& f3 t
  9.     SOCKADDR_IN clientaddr;; B) m7 S  q' r6 Q: J
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    % |- k2 A. A# l# W, m* I
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    & |7 D4 U8 X/ s- L

  12. . Y4 Q0 f" `7 o6 ~4 c- c0 Y

  13. 9 g1 V. j/ Y+ b- Y" E
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ! [$ i# Q9 w3 W. j9 Q& Q
  15.         printf("Socket has been created :%d", sockServer);* V, T' S+ U1 y) ~( Y8 ^
  16.     }5 e8 {" ~4 t* s. z4 Q$ {
  17.     else{
    + ~) C, R$ ?2 N  G+ E1 f4 a
  18.         printf("Socket create failed.");
    , |0 v8 m, L  S  l
  19.         exit(0);
    ) o, ]+ S- B: w" L1 L2 K8 B. f' Y
  20.     }
    $ B0 w' T" U; a! I+ a% h2 q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    * S4 ]2 S* z7 T2 O$ [' b
  22.     serveraddr.sin_family = AF_INET;7 U1 X7 J" a3 Z9 Z/ R' o, [
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000! ]1 \7 p' J/ |& `1 D4 t
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));" l1 s5 ]: }" R+ a& J7 T
  25.     char recvBuf[100];
    4 y0 D: L- F8 k5 @; A
  26.     int len = sizeof(SOCKADDR);
    6 h$ E& A7 M, j& J" h8 Q# ~9 _! p$ q
  27.     listen(sockServer, 5);//5为等待连接数
    5 f) p9 W( T/ o# U# R
  28.     while (1){; o3 \$ G' ?3 i, S! u' {* P8 q& O
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);5 ^/ E5 ?3 H: g' o, I, z
  30.         //接收客户端数据2 L& v1 G9 ^. ?' L' i, x# F6 X
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    6 k0 m1 }. y+ X
  32.         printf("to me:%s\n",recvBuf);3 n9 e8 \, R- a: K; [! q. C; X
  33.         memset(recvBuf, 0, 100);, Z  ^" ?: I1 ^1 a
  34.     }
    & N1 S2 B/ b7 x. A
  35.     closesocket(sockClient);
      D* l* u5 `: f
  36.     system("pause");
    9 A0 c3 L! L7 ^8 w9 i
  37.     return 0;  k4 d; O  S' D  L9 U
  38. }
复制代码
客户端代码:
1 W: R: U2 J1 H; ]! S
  1. #include<winsock2.h>* u. {$ `% d  S% S
  2. #include<stdio.h>
    3 x4 S  n8 e7 J) }8 c
  3. #pragma comment(lib, "ws2_32.lib")
    ; G$ G4 V5 }. i- z0 H, J+ n
  4. void main()$ T6 L; o8 q% ^4 E
  5. {
    ; l% j. u7 W9 |( O; [
  6.     WSADATA wsaData;  I) u' U4 c: e! n
  7.     SOCKET sockClient;//客户端Socket7 S; [  m, }! S5 u3 g& J; M
  8.     SOCKADDR_IN addrServer;//服务端地址! M8 Z4 g- y3 b
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    4 S" H! \2 U! l6 \
  10.     char message[20] = "HelloSocket!";$ A+ Y( w7 C2 l. u  K7 Z
  11.     //定义要连接的服务端地址
    : f- K' T' b1 h5 _. H% k8 }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    4 |5 }! {, K6 @4 }  u, {& I. D
  13.     addrServer.sin_family = AF_INET;
    ' g& @% a+ d' U8 p4 i' Q
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    1 ]3 Z1 Z$ _2 D8 ]2 R7 a
  15.     //新建客户端socket$ U  ^+ W! J0 \
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    5 F) J& H3 s$ d
  17.     int s = 0;
    6 a% g, n* p! `, }! n, s+ {, G
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));- \$ F. Y2 L: ?& F
  19. , v' |5 g- S7 ^3 M' ^. a" G9 T) T
  20.     while (1){
    7 P3 u. }( S) ~' p- d- K
  21.         //发送数据
    ) ^3 u2 N' G8 k0 W7 O
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    0 {; D, ~% u9 V* j
  23.         printf("to server:");$ N- o- Q' u  k% e
  24.         scanf("%s", message);1 |) p- \1 t, B% B$ u$ Y, f  ~/ m  s
  25. + v5 V: \) j; P4 ^9 y
  26.     }
    1 G" M+ E+ m; K/ g4 g% ~- D9 M) |
  27.     //关闭socket
    $ A# G5 I( ~( K3 c$ j6 L" [# U8 `+ k
  28.     closesocket(sockClient);
    - n3 u& T9 j( v! L! {
  29.     WSACleanup();# Z- E1 B; o4 B& f* Y6 t  U1 q4 ?
  30. }
复制代码
求懂的高手来解答一下。
! |8 u* Z5 S6 S+ ^6 O* S8 c, A' Q谢谢了!
5 l& L: s2 K* D, G8 {
4 @0 W* }2 F: v3 m) T
) T4 F- G  K: P) f4 ~7 P! V. o1 v: A

1 t9 U* w, a- p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
( \7 _/ a4 V2 b. b1 v: [recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 03:16 , Processed in 0.067885 second(s), 18 queries .

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