您的位置:首页 > 其它

UNIX本地套接字 示例

2013-11-19 11:09 134 查看
server.c:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

#if 0
#define SOCK_UNIX_FILE "/tmp/video1_sock"
#else
#define SOCK_UNIX_FILE "/tmp/video_sock"
#endif
#define MAX_TRANSMIT_DATA_LEN 10240
#define S_TIME_OUT 2000 //2s

int tcp_write(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
int ret;
int total_lenth = 0;
int len_remain = len;
char *write_position = buf;
struct timeval timeout;
fd_set  wset, eset;
int status = 1;

timeout.tv_sec =timeout_ms/1000;
timeout.tv_usec = timeout_ms%1000;
printf("%s  %d \n",__func__,__LINE__);
while(1){

FD_ZERO(&wset);
FD_ZERO(&eset);
FD_SET(socketfd, &eset);
FD_SET(socketfd, &wset);
ret = select(socketfd+1, NULL, &wset, &eset, &timeout);
printf("%s  %d \n",__func__,__LINE__);
if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
//timeout
printf(" write timeout \n");
break;
}
printf("%s  %d \n",__func__,__LINE__);
if(FD_ISSET(socketfd, &wset)){
printf("%s  %d \n",__func__,__LINE__);
ret = send(socketfd, write_position, len_remain, 0);
printf("%s  %d \n",__func__,__LINE__);
if(ret < 0){
printf(" write err \n");
return -1;
}

if(ret == 0){
printf(" write ==0 ... \n");

}
printf("%s  %d \n",__func__,__LINE__);
write_position += ret;
total_lenth += ret;
len_remain -= ret;
if(0 == len_remain) {
break;
}

}

if(FD_ISSET(socketfd, &eset)){
printf("write err \n");
break;

}

}

//printf("write %d \n",len -len_remain);
return len -len_remain ;
}

int tcp_read(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
int ret;
int total_lenth = 0;
int len_remain = len;
char *read_position = buf;
struct timeval timeout;
fd_set  rset, eset;

timeout.tv_sec =timeout_ms/1000;
timeout.tv_usec = timeout_ms%1000;
//printf("read timeout set %d %d\n",timeout.tv_sec,timeout.tv_usec);

while(1){

FD_ZERO(&rset);
FD_ZERO(&eset);
FD_SET(socketfd, &eset);
FD_SET(socketfd, &rset);

ret = select(socketfd+1, &rset, NULL, &eset, &timeout);

if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
//timeout
//printf(" read timeout \n");
break;
}

if(FD_ISSET(socketfd, &rset)){
ret = recv(socketfd, read_position, len_remain, 0);
if(ret < 0){
//error
//printf("read err\n");
break;
}
if(ret == 0){
//printf(" read %d..\n",ret);
// peer close
//printf(" peer close ?\n");
break;
}
//printf(" read %d...\n",ret);

read_position += ret;
total_lenth += ret;
len_remain -= ret;
if(len_remain <=0) break;

}

if(FD_ISSET(socketfd, &eset)){
printf("read err \n");
break;

}

}
//printf("time remain %d %d\n",timeout.tv_sec,timeout.tv_usec);
return total_lenth;
}

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>

int peer_sock_status = 0;
static void sig_handle(int signo)
{
switch(signo)
{

case SIGTERM:
printf("receive SIGTERM!\n");
exit(0);
break;
case SIGKILL:
printf("receive SIGKILL!\n");
exit(0);
break;
case SIGINT:
printf("\nreceive Ctrl+c!Then, the server will exit after 3 seconds !\n");
sleep(3);
exit(0);
break;
case SIGALRM:
printf("receive SIGALRM!\n");
break;
case SIGILL:
printf("receive SIGILL!\n");
break;
case SIGSEGV:
printf("receive SIGSEGV!\n");
break;
case SIGPIPE:
peer_sock_status = 0;
printf("receive SIGPIPE!\n");
break;
default:
printf("receive unknown signal(%d)!\n", signo);
break;
}
}

int main (int argc, char *argv[])
{
int server_sockfd, client_sockfd;
int server_len, client_len;
static int i_tmp = 0;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
int i, bytes;
char ch_send, ch_recv;
char s_buf[MAX_TRANSMIT_DATA_LEN];
char r_buf[8];
unsigned int len = 0;
unlink (SOCK_UNIX_FILE);//delete the file link for the function of bind

server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);

server_address.sun_family = AF_UNIX;

strcpy (server_address.sun_path, SOCK_UNIX_FILE);

server_len = sizeof (server_address);

bind (server_sockfd, (struct sockaddr *)&server_address, server_len);

listen (server_sockfd, 5);//the num of the client is five

printf ("Server is waiting for client connect...\n");

client_len = sizeof (client_address);
#if 1
for(i=1; i<=SIGIO; i++) signal(i, sig_handle);
#endif
accept_again:
if(i_tmp != 0)
{
printf ("\nServer is waiting for client connect...\n");
}
client_sockfd = accept (server_sockfd, (struct sockaddr *)&server_address, (socklen_t *)&client_len);

if (client_sockfd == -1) {
perror ("accept");
exit (EXIT_FAILURE);
}
peer_sock_status =1;
printf ("The server is waiting for client data...\n");
strcpy(s_buf,"the tcp send stream to jss_server");

while(1){

memset(s_buf,0,MAX_TRANSMIT_DATA_LEN);
memset(r_buf,0,8);
sprintf(s_buf,"the %dth packet to jss_server !",i_tmp++);
printf("write data :");

if ((bytes = tcp_write(client_sockfd, s_buf, MAX_TRANSMIT_DATA_LEN,S_TIME_OUT)) <= 0) {
perror ("WWrite");
goto accept_again;

}

len += bytes;
printf(" %d %d\n",bytes,len);

usleep(2);
printf(" %s %d The status of the client is %s \n",__FUNCTION__,__LINE__,r_buf);
}
close (client_sockfd);
unlink ("server socket");
goto accept_again;
}


client.c:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

#if 1
#define SOCK_UNIX_FILE "/tmp/video1_sock"
#else
#define SOCK_UNIX_FILE "/tmp/video_sock"
#endif
#define MAX_TRANSMIT_DATA_LEN 10240
#define C_TIME_OUT 2000 //2s

int tcp_read(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
int ret;
int total_lenth = 0;
int len_remain = len;
char *read_position = buf;
struct timeval timeout;
fd_set  rset, eset;

timeout.tv_sec =timeout_ms/1000;
timeout.tv_usec = timeout_ms%1000;
//printf("read timeout set %d %d\n",timeout.tv_sec,timeout.tv_usec);

do{

FD_ZERO(&rset);
FD_ZERO(&eset);
FD_SET(socketfd, &eset);
FD_SET(socketfd, &rset);

ret = select(socketfd+1, &rset, NULL, &eset, &timeout);

if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
//timeout
//printf(" read timeout \n");
break;
}

if(FD_ISSET(socketfd, &rset)){
ret = recv(socketfd, read_position, len_remain, 0);
if(ret < 0){
//error
//printf("read err\n");
break;
}
if(ret == 0){
//printf(" read %d..\n",ret);
// peer close
//printf(" peer close ?\n");
break;
}
//printf(" read %d...\n",ret);

read_position += ret;
total_lenth += ret;
len_remain -= ret;
if(len_remain <=0) break;

}

if(FD_ISSET(socketfd, &eset)){
printf("read err \n");
break;

}

}while(0);

//printf("time remain %d %d\n",timeout.tv_sec,timeout.tv_usec);
return total_lenth;
}

int tcp_write(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
int ret;
int total_lenth = 0;
int len_remain = len;
char *write_position = buf;
struct timeval timeout;
fd_set  wset, eset;

timeout.tv_sec =timeout_ms/1000;
timeout.tv_usec = timeout_ms%1000;

while(1){

FD_ZERO(&wset);
FD_ZERO(&eset);
FD_SET(socketfd, &eset);
FD_SET(socketfd, &wset);
ret = select(socketfd+1, NULL, &wset, &eset, &timeout);

if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
//timeout
printf(" write timeout \n");
break;
}

if(FD_ISSET(socketfd, &wset)){
ret = send(socketfd, write_position, len_remain, 0);

if(ret < 0){
printf(" write err \n");

}

if(ret == 0){
printf(" write ==0 ... \n");

}

write_position += ret;
total_lenth += ret;
len_remain -= ret;
if(0 == len_remain) {
break;
}

}

if(FD_ISSET(socketfd, &eset)){
printf(" err \n");
break;

}

}

//printf("write %d \n",len -len_remain);
return len -len_remain ;
}

int main (int argc, char *argv[])
{

struct sockaddr_un address;
int sockfd;
int len;
int i, bytes;
int result;
char ch_recv, ch_send;
char r_buf[MAX_TRANSMIT_DATA_LEN];
char s_buf[8];
strcpy(s_buf,"LIVING");
len = 0;

if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror ("socket");
exit (EXIT_FAILURE);
}

address.sun_family = AF_UNIX;
strcpy (address.sun_path, SOCK_UNIX_FILE);
len = sizeof (address);

result = connect (sockfd, (struct sockaddr *)&address, len);
if (result == -1) {
printf ("ensure the server is up\n");
perror ("connect");
exit (EXIT_FAILURE);
}
printf("%s %d Connect succeed !\n",__FUNCTION__,__LINE__);

while(1){
//memset(r_buf,0,MAX_TRANSMIT_DATA_LEN);
bytes = tcp_read (sockfd, r_buf, MAX_TRANSMIT_DATA_LEN,C_TIME_OUT);
//bytes = recv(sockfd, r_buf, 10240, 0);
if (bytes <= 0) {
perror ("read");
exit (EXIT_FAILURE);
}

len +=bytes;
printf("read data %d, %d\n",bytes,len);

//sleep(5);
}

close (sockfd);

return (0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: