对于Socket编程零基础,同时也没有在linux下编程的经验,分享给和我一样的朋友。
服务器接收客户端多次传过来消息,同时返回给客户端进行循环处理。服务器得起一个线程,处理客户端传过来的消息,否则服务器与客户端只能通讯一次。
客户端:code
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
/* create a socket */
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, "/tmp/temp.socket");
/* connect to the server */
/* exchange data */
char ch = 'A';
int result = connect(sockfd, (struct sockaddr *)&address, sizeof(address));
if(result == -1)
{
perror("connect failed: ");
exit(1);
}
int i = 0;
while( i < 26) // 循环传递 A-Z字符
{
printf("send char to server: %c\n", ch);
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("recive char from server: %c\n", ch);
i++;
}
close(sockfd);
return 0;
}
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include "pthread.h"
#include <stdio.h>
void* fun_st(void *socketClient)
{
int *socketCtl2 = (int*)socketClient;
char ch;
while(1)
{
printf("recive char from client: %c\n",ch);
read(*socketCtl2,&ch, 1);
++ch;
printf("send char to client: %c\n",ch);
write(*socketCtl2,&ch, 1);
}
}
int main()
{
/* delete the socket file */
unlink("/tmp/temp.socket");
/* create a socket */
int server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un server_addr;
server_addr.sun_family = AF_UNIX;
strcpy(server_addr.sun_path, "/tmp/temp.socket");
/* bind with the local file */
bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
/* listen */
listen(server_sockfd, 5);
char ch;
int client_sockfd;
struct sockaddr_un client_addr;
socklen_t len = sizeof(client_addr);
printf("server waiting:\n");
int i =0;
/* accept a connection */
while(1)
{
pthread_t pid;
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &len);
if(client_sockfd == -1)
{
break;
}
pthread_create(&pid,NULL,fun_st,(void *)&client_sockfd);
}
close(client_sockfd);
close(server_sockfd);
return 0;
}
服务器端编译的时候需要加上-pthread,否则编译不过。