네트워크 socket 프로그래밍의 표준 템플릿 (온라인 사전 등록 및 로그인)
56817 단어 네트워크 프로그래밍
1.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define N 32
#define R 1 //user-register
#define L 2 //user-login
#define DATABASE "my.db"
typedef struct message
{
int type;
char name[N];
char data[128];
}MSG;
void exitfun();
void do_client(sqlite3 *db, int acceptfd);
void do_login(sqlite3 *db, MSG *msg, int acceptfd);
void do_register(sqlite3 *db, MSG *msg, int acceptfd);
int main(int argc, char *argv[])
{
struct sockaddr_in sin = {0};
struct sockaddr_in cin = {0};
int sockfd;
int ret;
socklen_t len = sizeof(sin);
int choice;
pid_t pid;
MSG msg;
char buf[128] = {0};
int acceptfd;
sqlite3 *db;
if(argc != 3)
{
perror("input wrong, please input server ip and port!");
exit(-1);
}
if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
{
perror("sqlite3_open");
exit(-1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
exit(-1);
}
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(argv[1]);
sin.sin_port = htons(atoi(argv[2]));
if((ret = bind(sockfd, (struct sockaddr *)&sin, sizeof(sin))) < 0)
{
perror("bind");
exit(-1);
}
if((ret = listen(sockfd, 5)) < 0)
{
perror("listen");
exit(-1);
}
signal(SIGCHLD, exitfun);
while(1)
{
if((acceptfd = accept(sockfd, (struct sockaddr *)&cin, &len)) < 0)
{
perror("accept");
exit(-1);
}
if((inet_ntop(AF_INET, (void *)&cin.sin_addr, buf, sizeof(cin))) == NULL)
{
perror("inet_ntop");
exit(-1);
}
printf("Client (%s\t%d) is connected!
", buf, ntohs(cin.sin_port));
if((pid =fork()) < 0)
{
perror("fork");
exit(-1);
}
if(pid == 0)
{
close(sockfd);
do_client(db, acceptfd);
}
if(pid > 0)
{
close(acceptfd);
}
}
return 0;
}
void exitfun(int sig)
{
printf("client exit
");
wait(NULL);
}
void do_client(sqlite3 *db, int acceptfd)
{
MSG msg;
while(recv(acceptfd, &msg, sizeof(msg), 0) > 0)
{
switch(msg.type)
{
case R:
do_register(db, &msg, acceptfd);
break;
case L:
do_login(db, &msg, acceptfd);
break;
default:
printf("Invaild input
");
break;
}
}
close(acceptfd);
exit(0);
}
void do_login(sqlite3 *db, MSG *msg, int acceptfd)
{
char sql[128] = {0};
char buf[32] = {0};
int nrow;
int ncolumn;
char *errmsg;
char ** result;
sprintf(sql, "select * from user where name = '%s' and passwd = '%s'", msg->name, msg->data);
if(sqlite3_get_table(db, sql, &result, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
{
printf("%s
", errmsg);
exit(-1);
}
if(nrow == 1)
{
strcpy(buf,"login success");
if(send(acceptfd, buf, sizeof(buf), 0) < 0)
{
perror("login send");
exit(-1);
}
}
else if(nrow == 0)
{
strcpy(buf,"name or passwd wrong");
if(send(acceptfd, buf, sizeof(buf), 0) < 0)
{
perror("login send");
exit(-1);
}
}
}
void do_register(sqlite3 *db, MSG *msg, int acceptfd)
{
char *errmsg;
char sql[128] = {0};
char buf[32] = {0};
sprintf(sql, "insert into user values ('%s', %s)", msg->name, msg->data);
if((sqlite3_exec(db, sql, NULL, NULL, &errmsg)) != SQLITE_OK)
{
printf("%s
",errmsg);
strcpy(buf, "name already exist");
}
else
strcpy(buf, "register ok");
if((send(acceptfd, buf, sizeof(buf), 0)) < 0)
{
perror("register send");
exit(-1);
}
}
2.
#include
#include
#include
#include
#include
#define N 32
#define R 1 //user-register
#define L 2 //user-login
typedef struct message
{
int type;
char name[N];
char data[128];
}MSG;
void do_register(int sockfd, MSG *msg);
int do_login(int sockfd, MSG *msg);
void do_search(int sockfd, MSG *msg);
void do_history(int sockfd, MSG *msg);
int main(int argc, char *argv[])
{
struct sockaddr_in sin = {0};
int sockfd;
int ret;
int choice;
MSG msg;
if(argc != 3)
{
perror("input wrong, please input server ip and port!");
exit(-1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
exit(-1);
}
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(argv[1]);
sin.sin_port = htons(atoi(argv[2]));
if((ret = connect(sockfd, (struct sockaddr *)&sin, sizeof(sin))) < 0)
{
perror("connect");
exit(-1);
}
while(1)
{
printf("*******************************
");
printf("1.register 2.login 3.quit
");
printf("*******************************
");
printf("input your choice
");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
do_register(sockfd, &msg);
break;
case 2:
do_login(sockfd, &msg);
break;
default:
printf("Invaild choice
");
break;
}
}
}
void do_register(int sockfd, MSG *msg)
{
char buf[32] = {0};
msg->type = R;
printf("input name:
");
scanf("%s",msg->name);
getchar();
printf("input passwd:
");
scanf("%s",msg->data);
if((send(sockfd, msg, sizeof(MSG), 0)) < 0)
{
perror("send");
exit(-1);
}
if((recv(sockfd, buf, sizeof(buf), 0)) <0)
{
perror("recv");
exit(-1);
}
printf("%s
", buf);
}
int do_login(int sockfd, MSG *msg)
{
char buf[32] = {0};
msg->type = L;
printf("input name:
");
scanf("%s",msg->name);
getchar();
printf("input passwd:
");
scanf("%s",msg->data);
if((send(sockfd, msg, sizeof(MSG), 0)) < 0)
{
perror("send");
exit(-1);
}
if((recv(sockfd, buf, sizeof(buf), 0)) <0)
{
perror("recv");
exit(-1);
}
if((strcmp(buf, "login success")) == 0)
{
printf("%s
", buf);
return 1;
}
else if((strcmp(buf, "name or passwd wrong")) == 0)
{
printf("%s
", buf);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 네트워크 프로그래밍 기본 자습서의 Socket 시작 사례우리가 자바에서 TCP/IP를 사용하여 네트워크를 통해 서버에 연결하려면 자바를 만들어야 합니다.net.Socket 객체를 서버에 연결합니다.Java NIO를 사용하려는 경우 Java NIO의 SocketChanne...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.