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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
. O$ G- z* s, o9 b我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。5 Y. K/ u2 w; F# m- W4 c. R/ Z
Talk is cheak , show me the code.
- n- s5 ~1 S1 N2 v; B服务端代码:; w' r7 x: N) G
  1. #include<stdlib.h>2 {: @% ?- p# m# c; \
  2. #include<WinSock2.h>
    9 B7 H1 y6 O9 d3 t
  3. #pragma comment(lib,"ws2_32.lib")0 U' V; k  g$ x+ L& z
  4. int main(){
    7 ?/ k! C( p: U4 H+ U" z: _
  5.     WSADATA wsd;
    8 s/ L0 L: B' ~
  6.     SOCKET sockServer;) j1 x8 X, V3 U& ]1 i
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    & P$ B! x; X4 Y3 z6 q+ o
  8.     SOCKET sockClient;" s6 n& g4 |9 {- I8 O7 L/ J4 b& P
  9.     SOCKADDR_IN clientaddr;
    $ ^! j/ F" h% J. y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口! X8 X; q: N& z! `; e8 |  k
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket( @9 J5 q1 j2 F; G

  12. ( z2 T9 U( }& W; w6 R
  13. & V% W; _2 c, G4 q7 u
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){6 C  \) [5 l# g2 W% K
  15.         printf("Socket has been created :%d", sockServer);
    : g3 d5 b5 }4 \) C" U) U+ f
  16.     }( ?$ M0 U7 A* C! t% I/ S- h1 t; P; H
  17.     else{: \3 x" \+ w% ^* _- x4 ~4 L
  18.         printf("Socket create failed.");+ W, H1 C& i# t* W  U
  19.         exit(0);: p) G+ l/ l- R# A9 E  \* x
  20.     }1 M0 L- t- I) l: q: ]. G
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  t" t, h3 k  ]
  22.     serveraddr.sin_family = AF_INET;' R9 Q3 G  |2 `7 E" H
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
      @8 S* \& t( x  N
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& h$ m2 Z+ U6 Z
  25.     char recvBuf[100];4 I/ T# u+ U3 W7 q9 Y$ h6 n
  26.     int len = sizeof(SOCKADDR);1 i- D& T" ~5 l7 I" l! E
  27.     listen(sockServer, 5);//5为等待连接数
    . D4 F0 L/ }. W( E( f; v
  28.     while (1){
    5 e' w5 z# E( g% N
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);( Y# A( V. M) f( w6 e
  30.         //接收客户端数据2 g8 l/ b- C3 Q, x' s8 B5 Z
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);2 J- h( W  v) i! }  N
  32.         printf("to me:%s\n",recvBuf);) f$ a$ j6 F+ j; x/ |8 [5 y
  33.         memset(recvBuf, 0, 100);
    : j' d1 S0 Q: V% {6 v1 Q
  34.     }
      {6 m3 x( F% B
  35.     closesocket(sockClient);  i4 t5 y' Q9 F, @, e0 B7 ]2 A  O
  36.     system("pause");' J; ~2 `/ G1 t2 g% a9 Q, D( n6 L
  37.     return 0;
    % y+ U- a# `, B: Z) G% p/ m0 p
  38. }
复制代码
客户端代码:
# C; _8 i. H% \" c1 C5 p
  1. #include<winsock2.h>' v. z* J/ P  Z$ n7 z: V- m- F
  2. #include<stdio.h>
    ! S( u% M6 Y1 d0 y( l. b5 Z
  3. #pragma comment(lib, "ws2_32.lib")
    ( ]- n6 T% F! l9 c2 t
  4. void main()
    5 C* ]7 E) M, S' C; p5 r2 v9 D
  5. {- A6 i$ N9 [, ?% Q- B
  6.     WSADATA wsaData;9 d! Q8 y; r8 o, Z' I( a
  7.     SOCKET sockClient;//客户端Socket
    , z( ^) z& G+ m
  8.     SOCKADDR_IN addrServer;//服务端地址: y/ z& V9 @" n9 E% z9 R4 C- L3 @
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);" D7 z. R' A5 I; V% b; t, d' [9 [  t
  10.     char message[20] = "HelloSocket!";
      U- e5 {2 @2 G  r
  11.     //定义要连接的服务端地址
      E' S: J5 x) Y( _: E3 C
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    6 c, t4 f) U' S; ?4 |
  13.     addrServer.sin_family = AF_INET;
    4 C1 o# z4 B; B, p1 O" K+ G, t
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    , s* F8 \  D2 k( N
  15.     //新建客户端socket% F! Q2 L0 [: b7 i1 X8 o; X. B$ I* L
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    / U' f/ A. d+ p- |/ P
  17.     int s = 0;
    ! {% n; T  `' A# `- ^6 [4 [
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ( k. ?6 T" P, W

  19. * A8 i0 r$ _" I
  20.     while (1){8 D4 y) @( J2 x+ J; @
  21.         //发送数据8 r* O* d1 H4 f: d5 M0 `
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);4 U+ S2 z; K- l4 i( A, @
  23.         printf("to server:");
    & L' o7 I- s/ @0 |. u- W% U
  24.         scanf("%s", message);
    ; W) t: ]2 z% [* @' ~9 ?$ V$ N

  25. " t+ d8 _/ H2 f6 c
  26.     }
    2 V7 L" n. J! [, `% z/ @& W
  27.     //关闭socket
    ; s( e1 n( u7 b3 G% {) W9 N
  28.     closesocket(sockClient);- d8 }* t3 _/ w. e
  29.     WSACleanup();# e7 m1 Y  y8 M/ w2 P
  30. }
复制代码
求懂的高手来解答一下。
/ z3 C4 @6 {2 {. D: q, [( K5 {# y谢谢了!
8 \4 l5 Z3 \1 q  E7 q
7 H$ y3 K  Q5 J# z- h
# [) `( l% v/ P2 S- U% e

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 03:17 , Processed in 0.107513 second(s), 18 queries .

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