Client code
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
int main ()
{
struct sockaddr_in server ;
struct socklen_t;
int sockid,status,count,count1 ;
char buffer[1024];
char buffer1[1024];
/* socket */
sockid = socket( AF_INET, SOCK_STREAM,0);
if (sockid == -1)
{
printf("could not create socket");
}
else
{
printf(" socket created\n");
}
memset((char *) &server, 0, sizeof(server));
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family =AF_INET;
server.sin_port = htons(20143);
/* connection */
status = connect(sockid ,(struct sockaddr *)&server, sizeof(struct sockaddr));
if (status == -1)
{
printf ("error in connection\n ");
}
else
{
printf("no error \n");
}
/* send*/
strcpy(buffer, "hello \n"),
printf("message: %s\n", buffer);
if(send(sockid, buffer ,strlen("buffer"),0) < 0 )
{
puts("sends failed");
return 1;
}
puts("data send");
/* receive
count1 = recv(sockid,,buf,0 );*/
if(recv(sockid, buffer1, 1024, 0) < 0 )
{
puts("receive failed ");
return 1;
}
puts("receive success");
puts(buffer1);
/*---- Print the received message ----*/
printf("Data received: %s",buffer1);
close (sockid);
}
server code is
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
struct sockaddr_in server ;
struct socklen_t ;
int s,sockid,status;
char buffer[1024];
char buffer1[1024];
/* socket */
sockid = socket(AF_INET, SOCK_STREAM,0);
if(sockid == -1)
{
printf("could not create socket");
}
{
printf(" socket created\n");
}
memset((char *)&server, 0, sizeof(server));
server.sin_addr.s_addr =inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(20143);
if((bind(sockid,(struct sockaddr *)&server, sizeof(struct sockaddr)))== -1)
{
puts("failure ");
return 1;
}
puts("success");
listen(sockid,5);
s = accept(sockid,(struct sockaddr *)&server, (socklen_t *)sizeof(server));
if(recv(sockid,buffer, 1024, 0)< 0 )
{
puts("receive failed ");
return 1;
}
puts("receive success");
puts(buffer1);
/*---- Print the received message ----*/
printf("Data received: %s",buffer);
enter code here
strcpy(buffer1,"Hello World\n");
if(send(sockid,buffer1,13,0) < 0 )
{
puts("failed ");
return 1;
}
puts("success");
close (sockid);
}
这里我试图在客户端和服务器之间建立双向连接,但我无法完成它因为我面临绑定的问题,即服务器没有与客户端绑定,每次它在绑定中显示错误。 PLZ为我提供了足够的解决方案..
答案 0 :(得分:2)
在这里你有办法在&#34; C&#34;中发表评论,评论是西班牙语,但我希望它有所帮助。 链接到我的Github:https://github.com/MarcosAguayo/sockets-c
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
/**
* Función que usa socket INET para conectarse con un servidor.
* @params char *hostServer, char *service
* @return res
*/
int abrirConexion (char *hostServer, char *service){
struct sockaddr_in dir;
struct servent *puerto;
struct hostent *host;
int res;
puerto = getservbyname (service, "tcp");
if(puerto == NULL) return -1;
host = gethostbyname (hostServer);
if(host == NULL) return -1;
dir.sin_family = AF_INET;
dir.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
dir.sin_port = puerto->s_port;
res = socket (AF_INET, SOCK_STREAM, 0);
if(res == -1) return -1;
if(connect (res, (struct sockaddr *)&dir, sizeof (dir)) == -1){
return -1;
}
return res;
}
/**
* Función para leer los datos del socket. Devuelve el total de bytes que
* ha leído, un -1 si da algun error o un 0 si se cierra.
* @params int fd, char *data, int longitud
* @return total
*/
int leerSocket (int fd, char *data, int longitud){
int total = 0;
int temp = 0;
// Validación de los parámetros de entrada
if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;
// Bucle que se ejecuta siempre que no hayamos leido todos los datos
while (total < longitud){
temp = read (fd, data + total, longitud - total);
if (temp > 0){
// Si se han leido los datos incrementamos la variable que después devolveremos
total = total + temp;
}else{
// Si devuelve 0, es que se ha cerrado el socket por lo que terminamos u devolvemos total
if (temp == 0) return total;
if (temp == -1){
switch (errno){
case EINTR:
case EAGAIN:
usleep (100);
break;
default:
return -1;
}
}
}
}
return total;
}
/**
* Escribe datos en el socket del cliente y devuelve el total de bytes que ha escrito
* @params int fd, char *data, int longitud
* @return num (Total bytes escritos) o -1
*/
int escribirSocket (int fd, char *data, int longitud){
int num = 0;
int temp = 0;
// Validar los parámetros
if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;
while (num < longitud){
temp = write (fd, data + num, longitud - num);
if (temp > 0){
num = num + temp;
}else{
if (temp == 0)
return num;
else
return -1;
}
}
return num;
}
/**
* Función MAIN
*/
void main (void){
int socketServer;
char cad[100];
// Abrimos la conexión con el server pasandole "localhost" y el nombre del servicio (/etc/services)
socketServer = abrirConexion ("localhost", "aguayo");
if (socketServer == 1){
printf ("No puedo establecer conexion con el servidor\n");
exit (-1);
}
strcpy(cad, "Hola");
escribirSocket(socketServer, cad, 5);
leerSocket (socketServer, cad, 6);
printf ("Hola buenas soy el cliente y he recibido: %s\n", cad);
close (socketServer);
}
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
/**
* Función para aceptar la conexion del socket
* @param int res
* @return int ch
*/
int aceptarConexion (int res){
socklen_t long_cl;
struct sockaddr cl;
int ch;
long_cl = sizeof (cl);
ch = accept (res, &cl, &long_cl);
if (ch == -1)return -1;
return ch;
}
/**
* Función que usa socket INET
* @params char *servicio
* @return res
*/
int abrirConexion (char *servicio){
struct sockaddr_in dir;
struct sockaddr cl;
struct servent *puerto;
socklen_t long_cl;
int res;
res = socket (AF_INET, SOCK_STREAM, 0);
if (res == -1) return -1;
// obtenemos el servicio del fichero /etc/services
puerto = getservbyname (servicio, "tcp");
if (puerto == NULL) return -1;
// Se comletan los campos de la estructura
dir.sin_family = AF_INET;
dir.sin_port = puerto->s_port;
dir.sin_addr.s_addr =INADDR_ANY;
if (bind (res, (struct sockaddr *)&dir, sizeof (dir)) == -1){
close (res);
return -1;
}
if (listen (res, 1) == -1){
close (res);
return -1;
}
return res;
}
/**
* Función para leer los datos del socket. Devuelve el total de bytes que
* ha leído, un -1 si da algun error o un 0 si se cierra.
* @params int fd, char *data, int longitud
* @return num
*/
int leerSocket (int fd, char *data, int longitud){
int num = 0;
int temp = 0;
// Validación de los parámetros de entrada
if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;
// Bucle que se ejecuta siempre que no hayamos leido todos los datos
while (num < longitud){
temp = read (fd, data + num, longitud - num);
if (temp > 0){
num = num + temp;
}else{
if (temp == 0) return num;
if (temp == -1){
switch (errno){
case EINTR:
case EAGAIN:
usleep (100);
break;
default:
return -1;
}
}
}
}
return num;
}
/**
* Escribe datos en el socket del cliente y devuelve el total de bytes que ha escrito
* @params int fd, char *data, int longitud
* @return total (Total bytes escritos) o -1
*/
int escribirSocket (int fd, char *data, int longitud){
int total = 0;
int temp = 0;
// Validar los parámetros
if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;
while (total < longitud){
temp = write (fd, data + total, longitud - total);
if (temp > 0){
total = total + temp;
}else{
if (temp == 0) return total;
else return -1;
}
}
return total;
}
/**
* Función MAIN
*/
void main (void){
int socketServer;
int socketClient;
char cad[100];
socketServer = abrirConexion ("aguayo");
if (socketServer == -1){
printf ("No se puede abrir socket servidor\n");
exit (-1);
}
socketClient = aceptarConexion (socketServer);
if (socketServer == -1){
printf ("No se puede abrir socket de cliente\n");
exit (-1);
}
leerSocket (socketClient, cad, 5);
printf ("Soy el Servidor y he recibido: %s\n", cad);
strcpy (cad, "Adios");
escribirSocket (socketClient, cad, 6);
close (socketClient);
close (socketServer);
}