我还是 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通信的步骤是
- 使用
socket()
函数创建套接字。 - (可选)使用
bind()
函数将套接字绑定(bind)到本地地址和/或端口。 - 使用
connect()
将打开的套接字连接到服务器地址。 - 使用
read()
和write()
发送或接收数据,或使用recv()
和send()
.
服务器端的步骤是
- 使用
socket()
函数创建套接字。 - 使用
bind()
函数将套接字绑定(bind)到本地地址和/或端口。 - 使用
listen()
监听连接。 - 使用
accept()
接受连接。 - 使用
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/