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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
( W- H7 w# K4 A8 T' n; G- v* C我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。. c! d5 c+ w1 l) ~' `0 w8 T
Talk is cheak , show me the code.
! A9 `7 k; @3 B( e% C- f服务端代码:
- N1 M1 L1 F. ?7 a
  1. #include<stdlib.h>
    * }  \& l* A; w  ?7 ]. v1 N' q
  2. #include<WinSock2.h>2 W& W% l2 Q5 f6 {2 F
  3. #pragma comment(lib,"ws2_32.lib")
    ! s3 W1 p: a# i. x* M; S
  4. int main(){1 U7 G# `- S% z7 r1 Y
  5.     WSADATA wsd;5 V0 \/ T+ e5 N: O  N8 R4 E
  6.     SOCKET sockServer;
    ' ~0 P9 u0 _3 j* e4 Q" A
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号0 F  q3 ?4 [( K: G
  8.     SOCKET sockClient;
    ; `4 k# j# L" V
  9.     SOCKADDR_IN clientaddr;8 X8 P1 g8 E0 d& Z$ J/ Z+ ~: Z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    - P. U! s& t+ p) n: l7 ?6 t
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ( V/ b9 I; T1 |& S+ V

  12. % U9 Y3 ]0 y) z) }

  13. 1 t( V: D4 j6 ?8 \
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    0 k+ v  q( q7 n6 \  x9 i+ G4 y
  15.         printf("Socket has been created :%d", sockServer);" K* s4 Z" [2 ~) m6 g0 h. \
  16.     }; M, s& x/ D; [1 O* L: H& ?+ Q6 K
  17.     else{
    % l( q6 Q: w( l# H
  18.         printf("Socket create failed.");
    3 s. q7 T0 x8 [* ^
  19.         exit(0);/ X3 B% P+ R1 J9 z3 \
  20.     }
    2 r  O3 @8 {0 Y/ T7 Y
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    " V# i: b# K: G! z0 C
  22.     serveraddr.sin_family = AF_INET;2 ^2 c# c  o8 Q1 B5 }) S
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    & s0 I$ @# u, `  e
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));$ g9 P$ u0 u. X- q7 j
  25.     char recvBuf[100];$ l% n: n! J; V( {
  26.     int len = sizeof(SOCKADDR);
      g2 t, B9 u+ `
  27.     listen(sockServer, 5);//5为等待连接数8 V( ^- H" P- Z& P" n
  28.     while (1){
    & e0 p: r" k  D" h( n
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);; u  I5 E& V- s2 @/ [
  30.         //接收客户端数据
    . K: L% c: x5 G% }6 F) `1 |
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);: H8 l+ ^4 K1 ~/ L- N$ t
  32.         printf("to me:%s\n",recvBuf);
    * |: `4 y& U% ^$ ~6 ^  S% D4 n
  33.         memset(recvBuf, 0, 100);$ V4 c1 y1 D3 B/ e  q
  34.     }
    ( ]+ D. g& p. P0 r1 c  \! L
  35.     closesocket(sockClient);
    ! j/ m: q) J6 e. f$ w
  36.     system("pause");  `9 u* b8 w" ~( s6 F3 s! `, ]
  37.     return 0;, d+ d0 F/ H0 z
  38. }
复制代码
客户端代码:: z3 u1 f! V4 Y" L* j
  1. #include<winsock2.h>. ~7 [4 n, I$ h1 C* `
  2. #include<stdio.h>
    5 j6 M) }& a  D" Q+ f% a
  3. #pragma comment(lib, "ws2_32.lib")
    9 w3 k! t4 C+ i; ^7 d
  4. void main()
    . w7 I4 u9 p* @4 [+ l. g  j
  5. {4 q! j) q3 Y; x  P7 Q  j
  6.     WSADATA wsaData;0 q8 [; b7 b2 U
  7.     SOCKET sockClient;//客户端Socket
    0 d5 l9 o( P1 @5 A* W6 Z" X
  8.     SOCKADDR_IN addrServer;//服务端地址
    , z& f/ I0 {+ S
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);# |' n2 [, U0 h* K# q! t
  10.     char message[20] = "HelloSocket!";
    $ s* E$ @8 a2 j2 M. A! r3 z
  11.     //定义要连接的服务端地址. G( N- \: M6 R% L+ H3 H
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    6 Y8 q( a, z( k# A1 ]- J
  13.     addrServer.sin_family = AF_INET;
    / Y0 l: f( y) d& Z
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ( o. ?9 C% u- \& K7 }
  15.     //新建客户端socket
    # d7 S$ z8 d& Y- `$ R3 v6 O
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    , {7 Q2 p1 D- D8 p7 p% J8 F" W! d* B
  17.     int s = 0;
    8 ?' V: [0 O1 ?0 o  t
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    6 k8 P5 x, ^: n8 V+ S

  19. : Z: c6 K9 Q% p) L
  20.     while (1){
    # G0 X- `8 d) h$ f  J6 l
  21.         //发送数据
    ( J+ S) H0 I2 B+ |. u* k1 }
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);1 }1 d! G+ _2 Y  S* V: |  M4 Z
  23.         printf("to server:");
      a* [2 r: I8 ]! N
  24.         scanf("%s", message);
    - `1 r) o. }: S1 Z3 {

  25. 0 W8 S, ~, c) D0 z- F& z  ?% v
  26.     }
    5 W4 a* y: e2 \8 e4 P
  27.     //关闭socket
    , \, R; D5 ]. Y; N# l$ J; s2 |
  28.     closesocket(sockClient);3 f3 P; N% M! o* f, `( R$ h
  29.     WSACleanup();
      Z% v. V: W& q, Z* R
  30. }
复制代码
求懂的高手来解答一下。7 m- k( a7 ]4 ?3 U0 k5 e
谢谢了!
. }; J, d2 j" K  z0 g

/ h" V) I1 _  Y7 N# ]; E9 E: m) j5 B; X8 C: F6 \
0 q+ G1 W: }" x. I9 {7 @8 N; E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为  k. d) @6 s* l2 C& o2 K: k* g
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 14:46 , Processed in 0.051891 second(s), 19 queries .

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