tcp server side

  #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXLINE 512
#define SERV_PORT 8000

int main(void)
{
        struct sockaddr_in servaddr, chiaddr;
        socklen_t cliaddr_len;
        int listenfd, connfd;
        char buf[MAXLINE];
        char str[INET_ADDRSTRLEN];
        int i, n;
        listenfd = socket(AF_INET, SOCK_STREAM,0);

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(SERV_PORT);

        bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));

        listen(listenfd, 20);

        connfd = accept(listenfd, (struct sockaddr*)&chiaddr, &cliaddr_len);
                
        while (1)
        {
                printf("Accepting connections ... \n");
                cliaddr_len = sizeof(chiaddr);
                memset(buf,0,sizeof(buf));
                n = recv (connfd,buf,sizeof(buf),0);
                //n = read(connfd, buf, MAXLINE);
                printf("size n %d\n",sizeof(n));
                printf("receive form %s at Port %d data:",inet_ntop(AF_INET, &chiaddr.sin_addr, str, sizeof(str)), ntohs(chiaddr.sin_port));
                /*for (i=0; i<n; i++)
                {
                        buf[i] = toupper(buf[i]);
                        //printf("%s\n",buf[i]);
                }*/
                //write(1, buf, n);
                printf("%s\n",buf);
                if(!(strcmp(buf,"bye")))
                {
                    break;        
                }
        }
        close(connfd);
        return 0;
}


tcp client side

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 8000

int main(int argc, char *argv[])
{
        struct sockaddr_in servaddr;
        char buf[MAXLINE];
        int sockfd, n;
        char str[512];

        /*if (argc !=2)
        {
                fputs("usage:./client message \n", stderr);
                exit(1);
        }
        str = argv[1];
        */
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
        servaddr.sin_port = htons(SERV_PORT);
        connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
        while(1)
        {
                memset(str,0,sizeof(str));
                printf("input data to sent= ");
                scanf("%s",&str);
                printf("data len= %d\n",sizeof(str));
                //fgets(str,strlen(str),stdin);
                //write(sockfd, str, sizeof(str));
                n = send(sockfd,str,strlen(str),0);
                //n = read(sockfd, buf, MAXLINE);
                //printf("Response from the serve:\n");
                //write (STDOUT_FILENO, buf, n);
                if(!(strcmp(str,"bye")))
                {
                        break;
                }
        }
        close(sockfd);
        return 0;
}


 

以下是支援持續連線的server及client, 當client斷線時,server會斷線後,再建立新的連線

 

tcp_server.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXLINE 512
#define SERV_PORT 8000

int recv_handle(int connfd)
{
char buf[MAXLINE];
int n = 0;
while (1)
{

//cliaddr_len = sizeof(chiaddr);
memset(buf, 0, sizeof(buf));
n = recv(connfd, buf, sizeof(buf), 0);
printf("n %d\n", n);
//printf("\treceive form %s at Port %d\n",
// inet_ntop(AF_INET, &chiaddr.sin_addr, str, sizeof(str)),
// ntohs(chiaddr.sin_port));
printf("\tRecving data: %s, string length %d\n", buf, strlen(buf));
/*
if(strlen(buf) == 0)
{
close(connfd);
connfd = accept(listenfd, (struct sockaddr*)&chiaddr, &cliaddr_len);
}
*/

if(!(strcmp(buf,"bye")))
{
break;
}
if (n <= 0) {
return 0;
}
}

return 0;
}

int main(void)
{
struct sockaddr_in servaddr, chiaddr;
socklen_t cliaddr_len;
int len;
int listenfd, connfd;
char str[INET_ADDRSTRLEN];
int i = 0;
listenfd = socket(AF_INET, SOCK_STREAM,0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));

listen(listenfd, 20);
len = sizeof(chiaddr);

while(1)

{
connfd = accept(listenfd, (struct sockaddr*)&chiaddr, &len);
printf("Accepting connections ... \n");

recv_handle(connfd);
}
close(connfd);
return 0;
}

 

tcp_client.c

#include <stdio.h>
#include <netdb.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>

#define SERV_PORT 8000
#define MAXDATA 512

#define MAXNAME 512
main(argc, argv)
int argc;
char **argv;
{
int fd; /* fd into transport provider */
int i; /* loops through user name */
int length; /* length of message */
int fdesc; /* file description */
int ndata; /* the number of file data */
char data[MAXDATA]; /* read data form file */
char data1[MAXDATA]; /*server response a string */
char buf[BUFSIZ]; /* holds message from server */
struct hostent *hp; /* holds IP address of server */
struct sockaddr_in myaddr; /* address that client uses */
struct sockaddr_in servaddr; /* the server's full addr */

/*
* Get a socket into TCP/IP
*/
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror ("socket failed!");

exit(1);
}
/*
* Bind to an arbitrary return address.
*/
bzero((char *)&myaddr, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(0);

if (bind(fd, (struct sockaddr *)&myaddr,
sizeof(myaddr)) <0) {
perror("bind failed!");
exit(1);
}
/*
* Fill in the server's address and the data.
*/

bzero((char *)&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);

hp = gethostbyname("127.0.0.1");
if (hp == 0) {
fprintf(stderr,
"could not obtain address of %s\n", "127.0.0.1");
return (-1);
}
bcopy(hp->h_addr_list[0], (caddr_t)&servaddr.sin_addr,
hp->h_length);
/*
* Connect to the server??.

*/
if (connect(fd, (struct sockaddr *)&servaddr,
sizeof(servaddr)) < 0) {
perror("connect failed!");
exit(1);
}

while(1){

memset(data , 0 , sizeof(data));
scanf("%s", data);

if (send(fd, data, sizeof(data), 0) == -1) {
perror("write to server error !");
exit(1);
}
printf("send %s\n", data);

if(!strcmp(data,"bye"))
{
break;
}
}

close (fd);
}

 

makefile

all:tcp_server tcp_client

tcp_server:tcp_server.c
  gcc $^ -o $@

tcp_client:tcp_client.c
  gcc $^ -o $@

clean:
  rm -rf tcp_server tcp_client *.o 
arrow
arrow
    全站熱搜

    = = 發表在 痞客邦 留言(0) 人氣()