socket簡単通信プログラミング送信文字列
4911 ワード
データ構造
ホストを通じてサーバーhostを取得し、socketを作成し、serveraddrを初期化し、connectを通じてサーバーに接続し、データを受け取る.
本機とリモートクライアントのアドレスを定義し、SOCK_を作成します.SREAM形式のsocketは、socketを自機のアドレスと結びつけ、このsocketを傍受状態にします.
ループ状態で、モニターチーム内のリンク要求を取得し、同時にsocketを作成し、取り出したクライアントアドレスを保存します.
リモートアドレスを印刷
fork新規サブプロセスを呼び出して、サブプロセスでsend()関数を使って後ろに作成したsocketからデータを送信します.
クライアント実行使用./client serverip
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