Environment: Linux
language: C + +
Communication Mode: TCP
The following uses the TCP protocol to write a simple server, the client, where the server side has been listening to the local port number No. 6666. If a connection request is received, the request is received and the message is received from the client, and the client establishes a connection to the server side. After the connection is established, read the contents of the file (/root/workspace/socket-picture/ bizhi.jpg), sent to the server side, the server side of the new New1.jpg file, the received file content is saved to new1.jpg, new1.jpg in the current directory;
Server.cpp
1#include <stdio.h>2#include <stdlib.h>3#include <string.h>4#include <errno.h>5#include <sys/types.h>6#include <sys/socket.h>7#include <netinet/inch.h>8#include <unistd.h>9 Ten #defineMAXLINE 4096 One A intMainintargcChar**argv) { - intlistenfd, CONNFD; - structsockaddr_in servaddr; the Charbuff[4096]; -FILE *FP; - intN; - + if(LISTENFD = socket (af_inet, Sock_stream,0)) == -1 ){ -printf"Create socket Error:%s (errno:%d) \ n", Strerror (errno), errno); + return 0; A } atprintf"----init socket----\ n"); - -memset (&SERVADDR,0,sizeof(SERVADDR)); -servaddr.sin_family =af_inet; -SERVADDR.SIN_ADDR.S_ADDR =htonl (inaddr_any); -Servaddr.sin_port = htons (6666); in //to set up ports for reuse - intcontain; toSetSockOpt (Listenfd,sol_socket, SO_REUSEADDR, &contain,sizeof(int)); + - if(Bind (LISTENFD, (structsockaddr*) &servaddr,sizeof(SERVADDR)) == -1){ theprintf"bind socket Error:%s (errno:%d) \ n", Strerror (errno), errno); * return 0; $ }Panax Notoginsengprintf"----bind sucess----\ n"); - the if(Listen (LISTENFD,Ten) == -1){ +printf"Listen socket Error:%s (errno:%d) \ n", Strerror (errno), errno); A return 0; the } + if(fp = fopen ("new1.jpg","AB") ) ==NULL) - { $printf"file.\n"); $ Close (LISTENFD); -Exit1); - } the -printf"======waiting for client ' s request======\n");Wuyi while(1){ the structsockaddr_in client_addr; -Socklen_t size=sizeof(CLIENT_ADDR); Wu if(CONNFD = Accept (LISTENFD, (structsockaddr*) &client_addr, &size)) = =-1){ -printf"Accept Socket Error:%s (errno:%d)", Strerror (errno), errno); About Continue; $ } - while(1){ -n =Read (CONNFD, buff, MAXLINE); - if(n = =0) A Break; +Fwrite (Buff,1, N, FP); the } -Buff[n] =' /'; $printf"recv msg from client:%s\n", buff); the Close (CONNFD); the fclose (FP); the } the Close (LISTENFD); - return 0; in}
Client.cpp
1#include <stdio.h>2#include <errno.h>3#include <string.h>4#include <netdb.h>5#include <sys/types.h>6#include <netinet/inch.h>7#include <sys/socket.h>8#include <stdlib.h>9#include <unistd.h>Ten#include <arpa/inet.h> One#include <netdb.h> A #defineMAXLINE 4096 - - intMainintargcChar**argv) { the intsockfd, Len; - CharBuffer[maxline]; - structsockaddr_in servaddr; -FILE *Fq; + - if(ARGC! =2){ +printf"usage:./client <ipaddress>\n"); A return 0; at } - - if(SOCKFD = socket (af_inet, Sock_stream,0)) <0){ -printf"Create socket Error:%s (errno:%d) \ n", Strerror (errno), errno); - return 0; - } in -memset (&SERVADDR,0,sizeof(SERVADDR)); toservaddr.sin_family =af_inet; +Servaddr.sin_port = htons (6666); - if(Inet_pton (Af_inet, argv[1], &servaddr.sin_addr) <=0){ theprintf"Inet_pton error for%s\n", argv[1]); * return 0; $ }Panax Notoginseng - if(Connect (SOCKFD,structsockaddr*) &servaddr,sizeof(SERVADDR)) <0){ theprintf"Connect Error:%s (errno:%d) \ n", Strerror (errno), errno); + return 0; A } the if(Fq = fopen ("/root/workspace/socket-picture/bizhi.jpg","RB") ) ==NULL) { +printf"File open.\n"); - Close (SOCKFD); $Exit1); $ } - -Bzero (Buffer,sizeof(buffer)); the while(!feof (FQ)) { -Len = fread (buffer,1,sizeof(buffer), FQ);Wuyi if(Len! =Write (sockfd, buffer, Len)) { theprintf"write.\n"); - Break; Wu } - } About Close (SOCKFD); $ fclose (FQ); - - return 0; -}
Makefile
1 All:server Client2 SERVER:SERVER.O3g++-G-o server server.o4 CLIENT:CLIENT.O5g++-G-o client client.o6 Server.o:server.cpp7g++-G-C Server.cpp8 Client.o:client.cpp9g++-G-C client.cppTen Clean:all OneRM All
after the make command is executed, the server and client two executables are generated. Open two terminal Windows respectively, one executes the./server command, one executes the./client 127.0.0.1 command, which indicates that the 6666 port of the machine is attached, executing the./server command to execute first. After executing the./client 127.0.0.1 command, client clients exit directly after execution, and you can see the terminal window of the server output "Recv msg from client:". Open the current directory (refers to the directory where the executable file server is located), you can see the new1.jpg file has been generated, double-click Open, the contents of the file is not lost.
Linux C + + TCP socket transfer file or picture instance