socket簡単通信プログラミング送信文字列

4911 ワード

データ構造
struct sockaddr_in {
  sa_family_t		sin_family;	/* Address family		*/
  __be16		sin_port;	/* Port number			*/
  struct in_addr	sin_addr;	/* Internet address		*/

  /* Pad to size of `struct sockaddr'. */
  unsigned char		__pad[__SOCK_SIZE__ - sizeof(short int) -
			sizeof(unsigned short int) - sizeof(struct in_addr)];
};
 
struct in_addr {
	__be32	s_addr;
};
           struct hostent {
               char  *h_name;            /* official name of host */
               char **h_aliases;         /* alias list */
               int    h_addrtype;        /* host address type */
               int    h_length;          /* length of address */
               char **h_addr_list;       /* list of addresses */
           }
クライアント:
ホストを通じてサーバーhostを取得し、socketを作成し、serveraddrを初期化し、connectを通じてサーバーに接続し、データを受け取る.
#include <string.h>
#include "apue.h"
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>


#define   MAXDATASIZE  20
#define  SERVERPORT 3333


//socket client
int main(int argc,char *argv[])
{
	int sock_fd;
	int  recievbytes;
	char  buf[MAXDATASIZE];
	struct hostent  *host;
	struct  sockaddr_in  server_addr;

	if(argc<2)
		{
			printf("usage :hostname 
"); exit(1); } if((host=gethostbyname(argv[1]))==NULL) { herror("get hostname erro"); exit(1); } if((sock_fd=socket(AF_INET,SOCK_STREAM,0))<0) err_sys("clinet socket err"); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(SERVERPORT); // host->h_addr , * server_addr.sin_addr=*((struct in_addr *)host->h_addr); bzero(&(server_addr.sin_zero),8); if(connect(sock_fd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))<0) err_sys("connect erro"); if((recievbytes=recv(sock_fd,buf,MAXDATASIZE,0))<0) err_sys("recv erro"); buf[recievbytes]='\0'; printf("%s",buf); close(sock_fd); exit(1);
サーバ:
本機とリモートクライアントのアドレスを定義し、SOCK_を作成します.SREAM形式のsocketは、socketを自機のアドレスと結びつけ、このsocketを傍受状態にします.
ループ状態で、モニターチーム内のリンク要求を取得し、同時にsocketを作成し、取り出したクライアントアドレスを保存します.
リモートアドレスを印刷
fork新規サブプロセスを呼び出して、サブプロセスでsend()関数を使って後ろに作成したsocketからデータを送信します.
 
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include "apue.h"

#define   SERVERPORT  3333
#define  BACKLOG     10

int main(int argc,char *argv[])
{
	int  sockfd,clientfd;
	struct  sockaddr_in myaddr,remoteaddr;
	socklen_t  sin_size;

	if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
			{perror("socket erro");
			exit(1);
		}	
	
	myaddr.sin_family=AF_INET;
	myaddr.sin_port=htons(SERVERPORT);
	myaddr.sin_addr.s_addr=INADDR_ANY;
	

	 bzero(&(myaddr.sin_zero),8);
	 
	if(bind(sockfd,(struct sockaddr*)&myaddr,sizeof(struct sockaddr))<0)
		{perror("bind erro");
			exit(1);
		}	
	
	// sockfd      ,        ,     BACKLOG
	if(listen(sockfd,BACKLOG)<0)
		{perror("listen  erro");
			exit(1);
		}	
	
	while(1)
		{
			sin_size=sizeof(struct sockaddr_in);
			
		//             ,     socket           remoteaddr
	//		if((clientfd=accept(sockfd,(struct sockaddr*)&remoteaddr,&sin_size))<0)
		//		{
		//			perror("accept erro");
		////			continue;
		//		}
		if((clientfd = accept(sockfd, (struct sockaddr *)&remoteaddr, &sin_size)) == -1) 
		{
			perror("accept erro?);
			continue;
        }
			printf("recieve a connect ,the address is :%s 
",inet_ntoa(remoteaddr.sin_addr)); if(!fork()) { if(send(clientfd,"hello jakill
",13,0)<0) err_sys("send erro"); close(clientfd); exit(0); } close(clientfd); } exit(1); }
サーバプログラムのバックグラウンド実行
クライアント実行使用./client   serverip