/*
============================================================================
Name : work5.c
Author : yuanhuan
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <unistd.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <error.h>
void fun(int);
int main(int argc,char *argv[])
{
int fd;
struct hostent *he;
struct sockaddr_in server;//服务器地址
struct sigaction act;
act.sa_handler = fun;
act.sa_flags = SA_RESTART;//设置自动重启
if(argc!=2)
{
printf("Usage:%s<IP adderss> \n",argv[0]);
exit(-1);
}
if((he=gethostbyname(argv[1]))==NULL)
{
perror("gethostbyname error.");
exit(1);
}
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("creat socket failed");
exit(1);
}
sigaction(SIGINT, &act, NULL);
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(80);
server.sin_addr=*((struct in_addr *)he->h_addr);
if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
{
printf("connect error.\n");
}
else
{
printf("connect sucessed.\n");
}
close(fd);
}
void fun(int sig)
{
printf("in signal function.\n");
}
```c
在这里插入代码片
第五次
```c
#include <unistd.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <error.h>
void fun(int);
int main(int argc,char *argv[])
{
int fd;
struct hostent *he;
struct sockaddr_in server;//服务器地址
struct sigaction act;
act.sa_handler = fun;
act.sa_flags = SA_RESTART;//设置自动重启
if(argc!=2)
{
printf("Usage:%s<IP adderss> \n",argv[0]);
exit(-1);
}
if((he=gethostbyname(argv[1]))==NULL)
{
perror("gethostbyname error.");
exit(1);
}
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("creat socket failed");
exit(1);
}
sigaction(SIGINT, &act, NULL);
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(80);
server.sin_addr=*((struct in_addr *)he->h_addr);
if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
{
printf("connect error.\n");
}
else
{
printf("connect sucessed.\n");
}
close(fd);
}
void fun(int sig)
{
printf("in signal function.\n");
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>
#define PORT 5050
#define BACKLOG 5
#define MAXDATASIZE 1000
typedef struct CLIENT {
int fd;
char *name;
struct sockaddr_in addr;
char *data;
} CLIENT;
void process_cli(struct CLIENT *client, char *recvbuf, int len);
void savedata(char *recvbuf, int len, char *data);
int main() {
int i, maxi, maxfd, sockfd;
int nready;
ssize_t n;
fd_set rset, allset;
int listenfd, connectfd;
struct sockaddr_in server;
struct CLIENT client[FD_SETSIZE];
char recvbuf[MAXDATASIZE];
int sin_size;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Create socket failed.");
exit(-1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY );
if ((bind(listenfd, (struct sockaddr *) &server, sizeof(server))) == -1) {
perror("bind error.");
exit(1);
}
if ((listen(listenfd, BACKLOG)) == -1) {
perror("listen error.");
exit(1);
}
sin_size = sizeof(struct sockaddr_in);
maxfd = listenfd;
maxi = -1;
for (i = 0; i < FD_SETSIZE; i++)
client[i].fd = -1;
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
while (1) {
struct sockaddr_in addr;
rset = allset;
nready = select(maxfd + 1, &rset, NULL, NULL, NULL );
if (FD_ISSET(listenfd, &rset)) {
if ((connectfd = accept(listenfd, (struct sockaddr *) &addr,
&sin_size)) == -1) {
perror("accept error.");
continue;
}
for (i = 0; i < FD_SETSIZE; i++)
if (client[i].fd < 0) {
client[i].fd = connectfd;
client[i].name = malloc(sizeof(char) * MAXDATASIZE);
client[i].addr = addr;
client[i].data = malloc(sizeof(char) * MAXDATASIZE);
client[i].name[0] = '\0';
client[i].data[0] = '\0';
printf("You got a connection from client IP:%s, PORT:%d\n",
inet_ntoa(client[i].addr.sin_addr),
ntohs(client[i].addr.sin_port));
char buf[] = "Welcome sever conection! \n)";
send(connectfd, buf, sizeof(buf), 0);
break;
}
if (i == FD_SETSIZE) {
printf("too many cllients.\n");
}
FD_SET(connectfd, &allset);
if (connectfd > maxfd)
maxfd = connectfd;
if (i > maxi)
maxi = i;
if (--nready <= 0)
continue;
}
for (i = 0; i <= maxi; i++) {
if ((sockfd = client[i].fd) < 0)
continue;
if (FD_ISSET(sockfd, &rset)) {
if ((n = recv(sockfd, recvbuf, MAXDATASIZE, 0)) == 0) {
close(sockfd);
printf("Client (%s) closed connection. User’s data: %s\n",
client[i].name, client[i].data);
FD_CLR(sockfd, &allset);
client[i].fd = -1;
free(client[i].name);
free(client[i].data);
} else
process_cli(&client[i], recvbuf, n);
if (--nready <= 0)
break;
}
}
}
close(listenfd);
}
void savedata(char *recvbuf, int len, char *data) {
int start = strlen(data);
int i;
for (i = 0; i < len; i++) {
data[start + i] = recvbuf[i];
}
}
void process_cli(CLIENT *client, char *recvbuf, int len) {
int j;
char sendbuf[MAXDATASIZE];
recvbuf[len] = '\0';
if (strlen(client->name) == 0) {
memcpy(client->name, recvbuf, len);
printf("Client'sname is %s.\n", client->name);
return;
}
printf("Receivedclient( %s ) message: %s\n", client->name, recvbuf);
savedata(recvbuf, len, client->data);
for (j = 0; j < len; j++) {
sendbuf[j] = recvbuf[j];
}
sendbuf[len] = '\0';
printf("[>] Send reverse string:%s\n", sendbuf);
if ((send(client->fd, sendbuf, strlen(sendbuf), 0)) == -1) {
perror("send error.");
exit(1);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 5050
#define MAXDATASIZE 100
int main(int argc, char* argv[]) {
int socketfd;
char send_buf[MAXDATASIZE], recv_buf[MAXDATASIZE], buf[MAXDATASIZE];
struct hostent* remote_host;
struct sockaddr_in server;
if (argc != 2) {
printf("Usage:%s <IP address>\n", argv[0]);
exit(1);
}
if ((remote_host = gethostbyname(argv[1])) == NULL ) {
perror("gethostbyname error.");
exit(1);
}
if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket error.");
exit(1);
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr*) remote_host->h_addr);
if ((connect(socketfd, (struct sockaddr*) &server, sizeof(server))) == -1) {
perror("connect error.");
exit(1);
}
if ((recv(socketfd, buf, MAXDATASIZE, 0)) == -1) {
perror("you Receive welcome message fail.");
exit(1);
}
buf[sizeof(buf) - 1] = '\0';
printf("%s\n", buf);
printf("Please input your name:");
scanf("%s", buf);
if ((send(socketfd, buf, MAXDATASIZE, 0)) == -1) {
perror("send name error.");
exit(1);
}
while (1) {
printf("[*] Input string:");
scanf("%s", send_buf);
send_buf[strlen(send_buf)] = '\0';
if ((strlen(send_buf)) > 100) {
printf("your buf is more than 100,the biggest buf is 100.");
exit(1);
}
if ((send(socketfd, send_buf, MAXDATASIZE, 0)) == -1) {
perror("send error.");
exit(1);
}
if ((recv(socketfd, recv_buf, MAXDATASIZE, 0)) == -1) {
perror("recv error.");
exit(1);
}
if (!strcmp(recv_buf, "over")) {
close(socketfd);
break;
}
}
close(socketfd);
return 0;
}
服务器3
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 9999
#define BACKLOG 2
#define MAXDATASIZE 100
void process_cli(int connectfd, struct sockaddr_in client);
void *start_routine(void *arg);
struct ARG {
int connfd;
struct sockaddr_in client;
};
int main(void) {
int listenfd, connectfd;
pthread_t tid;
struct ARG * arg;
struct sockaddr_in server, client;
int sin_size;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Create socket failed.");
exit(-1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr *) &server, sizeof(struct sockaddr))
== -1) {
perror("Bind error.");
exit(-1);
}
if (listen(listenfd, BACKLOG) == -1) {
perror("listen error.");
exit(-1);
}
sin_size=sizeof(struct sockaddr_in);
while (1) {
if ((connectfd=accept(listenfd,(struct sockaddr*)&client,&sin_size))==-1) {
perror("accept error.");
exit(-1);
}
arg = (struct ARG*) malloc(sizeof(struct ARG));
arg->connfd = connectfd;
memcpy((void *) &arg->client, &client, sizeof(client));
if (pthread_create(&tid, NULL, start_routine, (void *) arg)) {
perror("Creat pthread error.");
exit(-1);
}
}
close(listenfd);
}
void process_cli(int connectfd, struct sockaddr_in client) {
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE],
client_name[MAXDATASIZE];
int recvlen, i;
printf("You got a connection from %s.\n", inet_ntoa(client.sin_addr));
send(connectfd, " 'Welcome to my server.(n", 22, 0);
recvlen = recv(connectfd, client_name, MAXDATASIZE, 0);
if (recvlen == 0) {
close(connectfd);
printf("client disconnectde.(n");
return;
} else if (recvlen < 0) {
close(connectfd);
printf("client broked.\n");
return;
}
client_name[recvlen] = '\0';
printf("Client name is %s.\n", client_name);
while ((recvlen = recv(connectfd, recvbuf, MAXDATASIZE, 0))) {
recvbuf[recvlen] = '\0';
printf("Received client< %s > message: %s.\n", client_name, recvbuf);
for (i = 0; i < recvlen; i++)
sendbuf[i] = recvbuf[recvlen - i - 1];
sendbuf[recvlen] = '\0';
send(connectfd, sendbuf, strlen(sendbuf), 0);
}
printf("Client:%s disconnected.\n", client_name);
close(connectfd);
}
void *start_routine(void *arg) {
struct ARG *info;
info = (struct ARG *) arg;
process_cli(info->connfd, info->client);
free(arg);
pthread_exit(NULL );
}
客服端
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#define PORT 9999
#define MAXDATASIZE 100
int main(int argc, char *argv[]) {
int fd, numbytes;
char buf[MAXDATASIZE];
struct hostent * he;
struct sockaddr_in server;
int i = 1;
if (argc != 2) {
printf("Usage: %s <lP address>\n", argv[0]);
exit(-1);
}
if ((he = gethostbyname(argv[1])) == NULL ) {
perror("gethostbyname error.");
exit(-1);
}
if ((fd = socket(AF_INET, SOCK_STREAM,0)) == -1) {
perror("Create socket failed.");
exit(1);
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr *) he->h_addr);
if ((i = connect(fd, (struct sockaddr *) &server, sizeof(struct sockaddr))== -1)) {
perror("connect failed.");
exit(1);
}
if (((numbytes = recv(fd, buf, MAXDATASIZE, 0)) == -1)) {
perror("recv error.");
exit(1);
}
buf[numbytes] = '\0';
printf("Server Message: %s", buf);
printf("Please input your name:");
scanf("%s", buf);
if (((numbytes = send(fd, buf, strlen(buf), 0)) == -1)) {
perror("send error.");
exit(1);
}
while (1) {
printf("Please input message(max char:%d):", MAXDATASIZE);
scanf("%s", buf);
if (strlen(buf) < 1)
i = 0;
if (((numbytes = send(fd, buf, strlen(buf), 0)) == -1)) {
perror("send error.");
exit(1);
}
if (((numbytes = recv(fd, buf, MAXDATASIZE, 0)) == -1)) {
perror("read error.");
exit(1);
}
buf[numbytes] = '\0';
printf("Server message:%s\n", buf);
printf("\n");
}
close(fd);
}