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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
6 Q1 ]( [/ \5 ^2 W; S5 j我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 A5 D6 }; {- \  b2 b- e3 `Talk is cheak , show me the code.9 r/ h& L$ |& X/ g# }7 Z1 z
服务端代码:- S$ t" l* g7 L( \
  1. #include<stdlib.h>
    9 h* x0 @+ o! E6 Y4 }
  2. #include<WinSock2.h>
    ( p' C- y. v+ Y" }. a( t; ~- M, @
  3. #pragma comment(lib,"ws2_32.lib")
    - J& y, i% Y4 N2 K* n8 [
  4. int main(){/ C2 ]  \. O; z
  5.     WSADATA wsd;  r$ [) d- N, c# B. x; _5 E3 U  O0 o
  6.     SOCKET sockServer;  V" s4 Y, n7 s# @* W
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ) S1 W) n) v: d9 [/ P
  8.     SOCKET sockClient;5 S% _- C8 \1 f6 G
  9.     SOCKADDR_IN clientaddr;
    ( P. e; g; A+ {) w8 D& k+ w
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口) s) r+ R1 s  H) d' A: f3 g  l& Q
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket; c( `) o7 n0 j: x* p, }( H
  12. $ q! N* v& }- v& G0 O8 a" ^8 F
  13. , s- ~% n; p! I/ ~! m
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){* u) P3 i8 f- u6 I3 J  {
  15.         printf("Socket has been created :%d", sockServer);) P# D  ?5 E/ G* n
  16.     }
    - X9 Q( a9 j3 J/ R3 q/ t
  17.     else{9 i5 B4 B+ F6 X* i1 n0 Y% j$ M
  18.         printf("Socket create failed.");
    ! q4 Y! t# u4 p' ~/ m8 d
  19.         exit(0);4 I. J0 G! B' i( s1 s
  20.     }
    % w6 k8 H! h2 ?& e
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    5 |' X" k+ k) O5 p4 w& }- F
  22.     serveraddr.sin_family = AF_INET;( v5 D2 Y7 z) ]! b% I! L8 P
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000! c+ E! J* X7 T0 i0 X$ z! B1 Y, B
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));" J  K/ Y) ~7 q  x6 F- F
  25.     char recvBuf[100];
    + X- }8 k& Z2 E
  26.     int len = sizeof(SOCKADDR);% ~2 N3 x2 n* H" _) |
  27.     listen(sockServer, 5);//5为等待连接数) M1 g: x7 \* Q# A
  28.     while (1){# v, v5 m2 }: t. V. y0 O
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    * y/ D8 F: {7 D1 }
  30.         //接收客户端数据
    + n" L2 X9 y8 O+ j0 u, h
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);$ E) X$ |% V8 ]# H; d, S: i0 w$ Y
  32.         printf("to me:%s\n",recvBuf);9 M- ?+ c: [  M, s
  33.         memset(recvBuf, 0, 100);
    8 U# n, u$ w2 v) G
  34.     }+ P* T9 O9 Z+ f  k5 I& q( R
  35.     closesocket(sockClient);7 _" m; p+ e  U5 |9 w+ A. ^
  36.     system("pause");
    6 Z' z8 p: i0 `2 y" P8 ~# H
  37.     return 0;
    ( P0 F3 e$ P& c: x6 a
  38. }
复制代码
客户端代码:( j) c/ R3 y) }7 g! i
  1. #include<winsock2.h>9 N6 H! f" ]5 d" _8 J1 p  ?) I
  2. #include<stdio.h>
    3 L( r9 e5 K9 Z0 D1 J
  3. #pragma comment(lib, "ws2_32.lib")# [' A% ~% A( T. A& B$ G
  4. void main()
    0 k5 K# N3 B$ o  o
  5. {1 |! A& Q' y' Q2 U) B, P$ Y! J3 K* N
  6.     WSADATA wsaData;
    % @6 K" V  O& N
  7.     SOCKET sockClient;//客户端Socket9 I/ n% ^. |/ ?! I- O! ~) ?, _  C
  8.     SOCKADDR_IN addrServer;//服务端地址
    / H! j$ q* k% W, z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ( q& r: W2 C: m2 o9 c# \
  10.     char message[20] = "HelloSocket!";" }! p1 L8 ?0 p# s) c' L  X: g8 Q
  11.     //定义要连接的服务端地址
    , `4 Z" o, j0 t5 ]4 K& z
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)" v3 ], ^% J( ^) j, P4 s4 }- u
  13.     addrServer.sin_family = AF_INET;
    , f* c/ U# Z6 t1 o% ]: W
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    + M8 [4 r# U: q* O( d0 L
  15.     //新建客户端socket
    & y; E3 c  F+ x( T
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    8 \- ~! f/ E9 a' P
  17.     int s = 0;
    7 t# d0 z* F; k% m4 E* Q
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));' x8 i0 Q5 t1 g
  19. , U; D0 R* k1 z" s8 u8 Q
  20.     while (1){
    & y* |* o9 d+ [. n4 C9 l& G
  21.         //发送数据
    7 W  s, m1 ?* ?2 M2 ]4 O
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    1 t2 S( T$ X# j3 M4 i2 J
  23.         printf("to server:");
    3 J8 ~, V9 [' `+ `: j& g% m
  24.         scanf("%s", message);
    ; Z! R8 J6 \* M7 ~

  25. + c, f* u4 z& }$ d* _6 l
  26.     }. @) u' u) n- G# S1 U6 g
  27.     //关闭socket: _, M( j+ ^+ q4 [/ H. `( N1 g. X
  28.     closesocket(sockClient);
    , P& `3 n' \- @% X
  29.     WSACleanup();" P1 I2 g$ F9 z6 ]
  30. }
复制代码
求懂的高手来解答一下。& `% q" o$ }! E0 X/ w
谢谢了!
, T# ?# {- e# W

7 Z& ]3 o! P$ ~) ~: H% M6 k+ f/ O. `+ l1 Z7 M! s

+ A. I) K$ D" ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
5 ]/ S* e6 _  X0 Trecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 08:13 , Processed in 0.062383 second(s), 19 queries .

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