简单的发送程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int get_sock_connet(char *ip, int port)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port);
inet_pton(AF_INET, ip, &serveraddr.sin_addr.s_addr);
if (connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("connect");
exit(-1);
}
return sockfd;
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Using error: ./process.c [ip] [port] \n");
exit(-1);
}
int sockfd = get_sock_connet(argv[1], atoi(argv[2]));
write(sockfd, "123", 3);
printf("write 3 bytes of normal data.\n");
sleep(1);
send(sockfd, "4", 1, MSG_OOB);
printf("send 1 byte of OOB data.\n");
sleep(1);
write(sockfd, "56", 2);
printf("write 2 bytes of normal data.\n");
sleep(1);
send(sockfd, "7", 1, MSG_OOB);
printf("send 1 byte of OOB data.\n");
sleep(1);
write(sockfd, "89", 2);
printf("write 2 bytes of normal data.\n");
sleep(1);
exit(0);
}
简单的接收程序
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#define ADDRESS "127.0.0.1"
#define PORT 1226
int sockfd;
int set_listen_accept(char *ip, int port)
{
int listensockfd = socket(AF_INET, SOCK_STREAM, 0);
if (listensockfd < 0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port);
inet_pton(AF_INET, ip, &serveraddr.sin_addr.s_addr);
if (bind(listensockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("bind");
exit(-1);
}
if (listen(listensockfd, 20) < 0)
{
perror("listen");
exit(-1);
}
int connsock = accept(listensockfd, NULL, NULL);
if (connsock < 0)
{
perror("accept");
exit(-1);
}
return connsock;
}
void sig_urg(int signo)
{
int n;
char buf[100];
bzero(buf, 100);
printf("SIGURG received.\n");
n = recv(sockfd, buf, 100, MSG_OOB);
printf("read %d OOB byte: %s.\n", n, buf);
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Using error: ./process.c [ip] [port] \n");
exit(-1);
}
sockfd = set_listen_accept(argv[1], atoi(argv[2]));
signal(SIGURG, sig_urg);
fcntl(sockfd, F_SETOWN, getpid());
int n;
char buf[100];
while (1)
{
bzero(buf, 100);
if ((n = read(sockfd, buf, 100)) == 0)
{
printf("recvived EOF.\n");
exit(0);
}
printf("read %d bytes:%s.\n", n, buf);
}
exit(0);
}
使用select代替信号的不正确版本
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <sys/select.h>
int sockfd;
int set_listen_accept(char *ip, int port)
{
int listensockfd = socket(AF_INET, SOCK_STREAM, 0);
if (listensockfd < 0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port);
inet_pton(AF_INET, ip, &serveraddr.sin_addr.s_addr);
if (bind(listensockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("bind");
exit(-1);
}
if (listen(listensockfd, 20) < 0)
{
perror("listen");
exit(-1);
}
int connsock = accept(listensockfd, NULL, NULL);
if (connsock < 0)
{
perror("accept");
exit(-1);
}
return connsock;
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Using error: ./process.c [ip] [port] \n");
exit(-1);
}
sockfd = set_listen_accept(argv[1], atoi(argv[2]));
fd_set rset, xset;
FD_ZERO(&rset);
FD_ZERO(&xset);
while (1)
{
FD_SET(sockfd, &rset);
FD_SET(sockfd, &xset);
select(sockfd + 1, &rset, NULL, &xset, NULL);
if (FD_ISSET(sockfd, &xset))
{
char buf[100];
bzero(buf, 100);
int n = recv(sockfd, buf, 100, MSG_OOB);
printf("read %d OOB byte: %s\n", n, buf);
}
if (FD_ISSET(sockfd, &rset))
{
char buf[100];
bzero(buf, 100);
int n = read(sockfd, buf, 100);
if (n == 0)
{
printf("read EOF\n");
exit(0);
}
printf("read %d bytes: %s\n", n, buf);
}
}
}
使用select代替信号的正确版本
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <sys/select.h>
int sockfd;
int set_listen_accept(char *ip, int port)
{
int listensockfd = socket(AF_INET, SOCK_STREAM, 0);
if (listensockfd < 0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port);
inet_pton(AF_INET, ip, &serveraddr.sin_addr.s_addr);
if (bind(listensockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("bind");
exit(-1);
}
if (listen(listensockfd, 20) < 0)
{
perror("listen");
exit(-1);
}
int connsock = accept(listensockfd, NULL, NULL);
if (connsock < 0)
{
perror("accept");
exit(-1);
}
return connsock;
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Using error: ./process.c [ip] [port] \n");
exit(-1);
}
sockfd = set_listen_accept(argv[1], atoi(argv[2]));
fd_set rset, xset;
int justreadoob = 0;
FD_ZERO(&rset);
FD_ZERO(&xset);
while (1)
{
FD_SET(sockfd, &rset);
if (justreadoob == 0)
{
FD_SET(sockfd, &xset);
}
select(sockfd + 1, &rset, NULL, &xset, NULL);
if (FD_ISSET(sockfd, &xset))
{
char buf[100];
bzero(buf, 100);
int n = recv(sockfd, buf, 100, MSG_OOB);
printf("read %d OOB byte: %s\n", n, buf);
justreadoob = 1;
FD_CLR(sockfd, &xset);
}
if (FD_ISSET(sockfd, &rset))
{
char buf[100];
bzero(buf, 100);
int n = read(sockfd, buf, 100);
if (n == 0)
{
printf("read EOF\n");
exit(0);
}
printf("read %d bytes: %s\n", n, buf);
justreadoob = 0;
}
}
}
使用sockatmark()函数定位带外标志
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <sys/select.h>
int set_listen_accept(char *ip, int port)
{
int listensockfd = socket(AF_INET, SOCK_STREAM, 0);
if (listensockfd < 0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port);
inet_pton(AF_INET, ip, &serveraddr.sin_addr.s_addr);
if (bind(listensockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("bind");
exit(-1);
}
if (listen(listensockfd, 20) < 0)
{
perror("listen");
exit(-1);
}
int connsock = accept(listensockfd, NULL, NULL);
if (connsock < 0)
{
perror("accept");
exit(-1);
}
return connsock;
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Using error: ./process.c [ip] [port] \n");
exit(-1);
}
int sockfd = set_listen_accept(argv[1], atoi(argv[2]));
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_OOBINLINE, &on, sizeof(on));
sleep(5);
while (1)
{
if (sockatmark(sockfd))
{
printf("at OOB mark\n");
}
int n;
char buf[100];
bzero(buf, 100);
if ((n = read(sockfd, buf, 100)) == 0)
{
printf("read EOF\n");
exit(0);
}
printf("read %d bytes: %s\n", n, buf);
}
exit(0);
}