C 编程 - 套接字 ("Server"在聊天中显示 "Client"名称)

标签 c windows sockets

我还是 C 套接字编程的新手,多亏了这个网站,我学到了很多有用的东西,但我找不到如何让服务器在聊天中显示客户端名称,我知道我需要使用命令:“发送(SOCKET s,const char *buf,int len,int flags);” ,但我不知道我做错了什么,语法错误或定位错误,idk,这些是代码:

(我把这个“//<------”放在我认为不对的地方)

服务器:

#include <stdio.h>
#include <conio.h>
#include <winsock.h>
#include <windows.h> //Sleep();
#include <locale.h>

WSADATA data;
SOCKET winsock;
SOCKADDR_IN sock;
char buffer[1024];
char buffer2[1024];
char nome[50];

int bytes;
int main(){
setlocale(LC_ALL,"");

if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR){
printf("Erro ao inicializar o winsock");
return 0;
}

if((winsock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){
printf("Erro ao criar socket");
return 0;
}

sock.sin_family=AF_INET;
sock.sin_port=htons(1234);

if(bind(winsock,(SOCKADDR*)&sock,sizeof(sock))==SOCKET_ERROR){
printf("Erro colocar utilizar a função BIND");
return 0;
}

listen(winsock,1);

while((winsock = accept(winsock,0,0))==SOCKET_ERROR){
Sleep(1);
}

printf("Cliente conectado!");

while(1){
 Sleep(1);
  memset(buffer2,0,1024);
  bytes=recv(winsock,buffer2,1024,0);

          if(bytes==-1){
          printf("Conexão perdida");
          getch();
          return 0;
          }

 memset(nome,0,50); //<------

 printf("%s:",nome);
 printf(buffer2);
 printf("Servidor: ");
 gets(buffer);
 strcat(buffer,"\r\n");
 send(winsock,buffer,strlen(buffer),0);

}
getch();
closesocket(winsock);
WSACleanup();
return 0;
}

客户:

#include <stdio.h>
#include <winsock.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#include <locale.h>

WSADATA data;
SOCKET winsock;
SOCKADDR_IN sock;
char buffer[1024];
char buffer2[1024];
char nome[50];
int bytes;

int main(){
    setlocale(LC_ALL,"");
    printf("Digite seu nome: ");
    gets(nome);


    strcat(nome,"\r\n");               //<------
    send(winsock,nome,strlen(nome),0); //<------
    memset(nome,0,50);                 //<------



if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR){
printf("Erro ao inicializar o winsock");
return 0;
}

if((winsock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){
printf("Erro ao criar socket");
return 0;
}

sock.sin_family=AF_INET;
sock.sin_port=htons(1234);
sock.sin_addr.s_addr=inet_addr("127.0.0.1");

if(connect(winsock,(SOCKADDR*)&sock,sizeof(sock))==SOCKET_ERROR){
printf("Erro ao se conectar");
return 0;
}

printf("Conectado!\n");

while(1){
 Sleep(1);
 printf("%s:",nome);
 gets(buffer);
 strcat(buffer,"\r\n");
 send(winsock,buffer,strlen(buffer),0);
 memset(buffer2,0,1024);
 bytes=recv(winsock,buffer2,1024,0);
       if(bytes==-1){
       printf("Conexão perdida");
       getch();
       return 0;
       }

 printf(buffer2);

}

getch();
closesocket(winsock);
WSACleanup();
return 0;
}

最佳答案

客户端socket通信的步骤是

  1. 使用 socket() 函数创建套接字。
  2. (可选)使用 bind() 函数将套接字绑定(bind)到本地地址和/或端口。
  3. 使用connect()将打开的套接字连接到服务器地址。
  4. 使用read()write() 发送或接收数据,或使用recv()send().

服务器端的步骤是

  1. 使用 socket() 函数创建套接字。
  2. 使用 bind() 函数将套接字绑定(bind)到本地地址和/或端口。
  3. 使用 listen() 监听连接。
  4. 使用 accept() 接受连接。
  5. 使用read()write() 发送或接收数据,或使用recv()send().

在您的代码中,您的客户端调用 send() 过早。您还没有打开套接字。

编辑: 在服务器代码上,您应该执行 memcpy() 将数据从 buffer2 复制到您的 nome 数组。请记住检查数组边界。

在客户端代码上,您需要删除 memset(nome,0,50); 并将 send() 移到 printf("Conectado!\n");.

关于C 编程 - 套接字 ("Server"在聊天中显示 "Client"名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26924304/

相关文章:

c - 为什么以这种方式拆分单词会崩溃?

c - 如何在 Linux 中通过共享内存发送整数

c# - 通过虚拟路径动态实例化 ASP.NET 页面类对象

c# - 这是确定操作系统架构的好方法吗?

iOS:在后台接收 UDP 数据时出现问题

java - 如何修复 'Server sending data faster than client can handle, server freezes'

c - 获取自己的蓝牙地址

c - 如何在 C Linux 中解析 JSON 响应?

python - 在 Python 中,如何检测计算机是否使用电池供电?

java - 在 Java 聊天中实现 SSL