【代码1】chat_tcp_client1.c
#include "header.h"
int main(int argc, char *argv[])
{
int connfd = -1;
if (0 > (connfd = socket(AF_INET, SOCK_STREAM, 0)))
err_exit("socket");
struct sockaddr_in server;
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = inet_addr("192.168.80.128");
if ( 0 > connect(connfd, (struct sockaddr *)&server, sizeof(server)))
err_exit("connect");
printf("connect success!\n");
char w_buf[BUFSIZ];
char r_buf[BUFSIZ];
int ret;
fd_set readfds;
int maxfd = -1;
int i;
while(1) {
FD_ZERO(&readfds);
FD_SET(0, &readfds);
maxfd = 0 > maxfd ? 0 : maxfd;
FD_SET(connfd, &readfds);
maxfd = connfd > maxfd ? connfd : maxfd;
ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
if (0 > ret)
err_exit("select");
else {
for (i = 0; i <= maxfd; i++) {
if (FD_ISSET(i, &readfds)) {
if (0 == i) {
fgets(w_buf, sizeof(w_buf), stdin);
if (!strncmp(w_buf, "quit", 4)) {
fprintf(stderr, "client quit!\n");
exit(0);
}
send(connfd, w_buf, strlen(w_buf) + 1, 0);
} else if (connfd == i) {
ret = recv(connfd, r_buf, sizeof(r_buf), 0);
if (ret < 0)
err_exit("recv");
else if (ret == 0) {
printf("server quit!\n");
exit(0);
}
printf("server : %s", r_buf);
}
}
}
}
}
close(connfd);
exit(0);
}
【代码2】chat_tcp_serve1r.c
#include "header.h"
int main(int argc, char *argv[])
{
int listenfd = -1;
if (0 > (listenfd = socket(AF_INET, SOCK_STREAM, 0)))
err_exit("socket");
struct sockaddr_in server, client;
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(8888);
/* server.sin_addr.s_addr = inet_addr("192.168.80.128"); */
/* inet_aton("192.168.80.128", &server.sin_addr); */
server.sin_addr.s_addr = htonl(INADDR_ANY);
/* server.sin_addr.s_addr = inet_addr("0"); */
int on = 1;
if (0 > setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
err_exit("setsockopt");
if (0 > bind(listenfd, (struct sockaddr *)&server, sizeof(server)))
err_exit("bind");
listen(listenfd, 1024);
printf("listen...\n");
bzero(&client, sizeof(client));
socklen_t len = sizeof(client); // must be done!
int connfd = -1;
if ( 0 > (connfd = accept(listenfd, (struct sockaddr *)&client, &len)))
err_exit("accept");
printf("client ip is %s, port number is %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
char w_buf[BUFSIZ];
char r_buf[BUFSIZ];
int ret;
fd_set readfds;
int maxfd = -1;
int i;
while(1) {
FD_ZERO(&readfds);
FD_SET(0, &readfds);
maxfd = 0 > maxfd ? 0 : maxfd; // 0 -- stdin
FD_SET(connfd, &readfds);
maxfd = connfd > maxfd ? connfd : maxfd; // connfd -- socket for communication
ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
if (0 > ret)
err_exit("select");
else {
for (i = 0; i <= maxfd; i++) {
if (FD_ISSET(i, &readfds)) {
if (0 == i) {
fgets(w_buf, sizeof(w_buf), stdin);
if (!strncmp(w_buf, "quit", 4)) {
printf("server quit!\n");
exit(0);
}
if (0 > send(connfd, w_buf, strlen(w_buf) + 1, 0))
err_exit("send");
} else if (connfd == i) {
ret = recv(connfd, r_buf, sizeof(r_buf), 0);
if (ret < 0)
err_exit("recv");
else if (ret == 0) {
printf("client quit!\n");
exit(0);
}
printf("client : %s", r_buf);
}
}
}
}
}
close(listenfd);
close(connfd);
exit(0);
}
【代码3】test_select.c
#include "header.h"
#include <fcntl.h>
int main(int argc, char *argv[])
{
fd_set readfds;
struct timeval tm;
int ret;
memset(&tm, 0, sizeof(tm));
char buf[32];
while(1) {
FD_ZERO(&readfds);
FD_SET(0, &readfds);
tm.tv_sec = 2;
tm.tv_usec = 0;
ret = select(1, &readfds, NULL, NULL, &tm);
if (0 > ret)
err_exit("select");
else if (0 == ret) {
printf("timeout!\n");
} else {
fgets(buf, sizeof(buf), stdin);
printf("fgets : %s", buf);
fflush(stdout);
}
}
exit(0);
}
【代码4】test_udp_client.c
#include "header.h"
int main(int argc, char *argv[])
{
if (3 > argc) {
fprintf(stderr, "Usage : %s + server IP + portnumber\n", argv[0]);
exit(1);
}
unsigned short port;
/* printf("%d\n",atoi(argv[1])); */
if (0 >= (port = atoi(argv[2]))) {
fprintf(stderr, "port number is invalid!\n");
exit(1);
}
int connfd = -1;
if (0 > (connfd = socket(AF_INET, SOCK_DGRAM, 0)))
err_exit("socket");
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
inet_aton(argv[1], &server.sin_addr);
char buf[BUFSIZ];
/* struct sockaddr_in client; */
/* memset(&client, 0, sizeof(client)); */
/* socklen_t len = sizeof(client); /\* must be done! *\/ */
while(1) {
fgets(buf, sizeof(buf), stdin);
sendto(connfd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&server, sizeof(server));
recvfrom(connfd, buf, sizeof(buf), 0, NULL, NULL);
//printf("client(ip : %s, port : %d) : %s", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buf);
printf("%s", buf);
}
close(connfd);
exit(0);
}
【代码5】test_udp_server.c
#include "header.h"
int main(int argc, char *argv[])
{
if (2 > argc) {
fprintf(stderr, "Usage : %s + portnumber\n", argv[0]);
exit(1);
}
unsigned short port;
/* printf("%d\n",atoi(argv[1])); */
if (0 >= (port = atoi(argv[1]))) {
fprintf(stderr, "port number is invalid!\n");
exit(1);
}
int connfd = -1;
if (0 > (connfd = socket(AF_INET, SOCK_DGRAM, 0)))
err_exit("socket");
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (0 > bind(connfd, (struct sockaddr *)&server, sizeof(server)))
err_exit("bind");
char buf[BUFSIZ];
struct sockaddr_in client;
memset(&client, 0, sizeof(client));
socklen_t len = sizeof(client); /* must be done! */
while(1) {
recvfrom(connfd, buf, sizeof(buf), 0, (struct sockaddr *)&client, &len);
printf("client(ip : %s, port : %d) : %s", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buf);
fgets(buf, sizeof(buf), stdin);
sendto(connfd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&client, sizeof(client));
}
close(connfd);
exit(0);
}